Kürzlich fragte mich ein Kollege, wie man denn am SQL Server den Inhalt einer Datei in ein Feld einlesen kann. Zufällig gibt es dazu am SQl-Server-2005 ein nettes neues Feature, dass man dazu missbrauchen äh gebrauchen kann…

Im folgenden Beispiel soll ein ASCII-File (nicht Unicode!) eingelesen werden, deswegen muss der Inhalt von Typ VARBINARY noch in den Typ VARCHAR konvertiert werden. Das gilt auch, wenn man das letztlich in ein Unicodefeld speichern will.

CREATE TABLE #bla (
id integer identity(1,1) NOT NULL primary key,
dateiinhalt varchar(max) not null)

INSERT INTO #bla(dateiinhalt)
SELECT CAST(bin as varchar(max)) FROM
OPENROWSET(BULK N'c:\test\ascii-file.txt', SINGLE_BLOB) AS a(bin)

select * from #bla

Risiken und Nebenwirkungen:

  • Um das einsetzen zu dürfen muss man entweder Admin sein oder die Verwendung von Openrowset auch für andere erlauben.
  • Die Datei muss für den SQL-Server erreichbar sein. Deswegen wird der Pfad aus der Sicht des SQL-Servers angegeben. Das bedeutet im einfachsten Fall, dass sie auf einer Festplatte des Servers liegt.
  • Falls der Server-Dienst in einem Benutzerkontext läuft, der auch Netzrechte hat, dann darf die Datei auch auf einer Freigabe liegen auf die dieser Benutzer Zugriffsrechte hat.