blog.atwork.at

news and know-how about microsoft, technology, cloud and more.

Wie bekomme ich binäre Dokumente (BLOBs) in den SQL Server?

Zu Artikel Teil Eins - Wie bekomme ich binäre Dokumente (BLOBs) aus dem SQL Server? - nun das Gegenstück: Teil Zwei - Wie kann ich Dateien IN den SQL Server bringen? Das heißt Files als BLOB (Binary Large Object) in eine Tabelle speichern - und das Ganze möglichst einfach.

Diese Lösung ist ebenfalls mit T-SQL zu bewerkstelligen. Die Idee dazu ist von databasejournal.com - Storing Images and BLOB files in SQL Server Part 2 entnommen, hier das Script:

savefromfile

(Das ganze Script gibt es hier zum Download, es läuft in SQL Server 2005 und 2008.)

Das Einlesen eines Files wird wieder in einer Stored Procedure "savefromfile" gemerkt.

Den gewünschten Filestream liefert OPENROWSET (Zeile 11, die Hilfe informiert: ...also supports bulk operations through a built-in BULK provider that enables data from a file to be read and returned as a rowset). Damit wird das File eingelesen. Das INSERT (Zeile 9) fügt einfach den Output des SELECTS (Zeile 10-11) in die Tabelle "MyFiles" ein. Also simpel.

Screenshot der Original-Tabelle: hier.
Nach dem Starten von "exec savefromfile" und Anzeigen der Tabelle  sieht das Ergebnis so aus:

myfiles_table_inserted

Das File "00006_Bild 1.jpg" wurde mit seinem Inhalt in die Tabelle MyFiles eingefügt. Fertig!

Noch ein Tipp für "Massen-Imports" - wenn mehrere Dateien so in die Datenbank insertiert werden sollen:

Hier kann man sich sehr rasch damit behelfen, in der Kommandozeile im Bilder-Verzeichnis die Dateinamen mit

dir /w > import.txt

in ein Textfile zu schreiben. Das Textfile "import.txt" dann mit Notepad öffnen, und die Dateinamen per Zwischenablage in eine neue Excel-Datei kopieren. In Excel werden die SQL-Befehle für die gewünschten Files zusammengebaut, beispielsweise so:

myfiles_excel_sql

Die Bildnamen stehen in Spalte A, in Spalte B wurde - wenn z.B. die ID aus dem Dateinamen weiterverwendet werden soll - diese aus dem Dateinamen extrahiert (B1: =LINKS(A1;5) ). Die "Formel" für Zelle C1:

="INSERT INTO MyFiles (FIL_ID, FIL_FileName, FIL_Content)
SELECT " & WERT(B1) & ", '" & A1 & "', BulkColumn FROM OPENROWSET(Bulk 'D:\Temp\bin\" & A1 & "', SINGLE_BLOB) AS BLOB);"

Die Formel ergibt dann das korrekte T-SQL-Statement für die jeweilige Datei:

INSERT INTO MyFiles (FIL_ID, FIL_FileName, FIL_Content)
SELECT 6, '00006_Bild 1.jpg', BulkColumn FROM OPENROWSET(Bulk 'D:\Temp\bin\00006_Bild 1.jpg', SINGLE_BLOB) AS BLOB);

Nun Zelle C1 bis ans Ende der Dateinamen "ausfüllen" lassen:

myfiles_excel_sql2

Und die so erzeugten SQLs per Zwischenablage im SQL Management Studio einfügen und laufen lassen. GO!

myfiles_excel_sql_execute

Tipp: Excel als Hilfsmittel zum Erzeugen von SQL-Befehlen und zum Nachbearbeiten von Daten ist übrigens eine Methode, die ich wirklich oft verwende und als äußerst praktisch empfehlen kann. Viel schneller gehts kaum. ;-)

Mit diesen Werkzeugen ist auch das Manipulieren von BLOBs in SQL Server rasch umsetzbar!

Loading