2010-03-08 7 views
9

Es tut mir leid, wenn diese Frage bereits gestellt wurde, aber ich konnte sie nirgendwo finden. Ich habe eine Tabelle, die Dateien als BLOBS speichert. Die Spalte, die die Datei enthält, ist ein Bilddatentyp. Ich möchte in der Lage sein, die Binärdaten aus der Spalte zu extrahieren und in eine tatsächliche Datei umzuwandeln. Ich würde das am liebsten gerne mit BCP oder dem Managementstudio machen.Wie verwende ich BCP oder Sql Server Management Studio, um BLOB-Daten aus Sql Server zu holen?

Ich habe BCP versucht, aber aus irgendeinem Grund, wenn ich versuche, ein Office-Dokument herauszuziehen, denkt Word, dass es korrupt ist. Hier ist, was ich bisher versucht (offensichtlich die Werte geändert wurden, die Unschuldigen zu schützen :):

bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -n -S server -U username -P password 

Dies allerdings nicht funktioniert? Irgendwelche Gedanken?

Bearbeiten Es stellt sich heraus, dass Sie die n-native Flag nicht benötigen. Außerdem versucht BCP ein 4-Byte-Präfix standardmäßig auf der Bildspalte enthalten - Sie wollen tatsächlich diesen Satz auf 0.

bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -S server -U username -P password 
 
Enter the file storage type of field document_binary [image]: 
Enter prefix-length of field document_binary [4]: 0 
Enter length of field document_binary [0]: 
Enter field terminator [none]: 

Antwort

20

ich meine eigene Frage zu beantworten, da ich verärgert immer mit SO mich zu Setup zu sagen eine Prämie

stellte sich heraus, Sie brauchen nicht auf die -n nativer Flagge. Außerdem versucht BCP ein 4-Byte-Präfix standardmäßig auf der Bildspalte enthalten - Sie wollen tatsächlich diesen Satz auf 0.

bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -S server -U username -P password 
 
Enter the file storage type of field document_binary [image]: 
Enter prefix-length of field document_binary [4]: 0 
Enter length of field document_binary [0]: 
Enter field terminator [none]: 
0

Wenn Sie C#/.NET-Code, dies zu tun verwenden können, wird die folgende KB-Artikel kann nützlich sein:

http://support.microsoft.com/kb/317016

Anscheinend kann man so etwas wie dies mit BCP tun und einer Formatdatei, aber IIRC die Formatdatei mit der genauen Anzahl von Bytes im Vorhinein gefüllt werden muss, es erwartet von der Säule zu ziehen, was es ziemlich unpraktisch macht. Eine andere Option, die Sie wählen können, ist die Verwendung von FILESTREAM im Jahr 2008 oder, wenn Sie nicht vorhaben, in naher Zukunft auf 2008 zu migrieren, die Dokumente im Dateisystem und einen Zeiger auf sie in der Datenbank zu speichern. Ja, es gibt Vor- und Nachteile, aber so haben wir uns bei allen bisherigen Projekten entschieden.

+0

ich Aaron, tun wir eigentlich alle unsere Dokumente auf dem Dateisystem speichern für 95 % unserer Bewerbung. Es gibt ein Bit, das immer noch Blobs verwendet :( – Eric

+0

Sie müssen die Formatdatei nicht mit der Feldlänge vorbelegen; das folgende funktioniert für mich (Zeilenumbrüche nach '9.0' und der folgenden' 1'): '9.0 1 SQLBINARY 0 0" "1 Spalte1" "' – Geoff

+0

@Aaron - anscheinend gibt es eine Menge Probleme mit dem Export von varbinary (max) in Datei. (Ich habe es gerade mit C# beendet - nach 3 Stunden zu versuchen mach es mit BCP). (Das Problem ist mit 'Refix-Länge von Feld document_binary', die auf '0' gesetzt werden sollte - aber es erfordert Benutzerinteraktion.) Es kann auch mit FMT-Datei getan werden., aber was, wenn ich nicht habe Zugriff auf die FMT-Datei - gibt es eine Möglichkeit, den fmt-Inhalt innerhalb des bcp-Befehls "inline" zu verwenden? –

Verwandte Themen