Export Binär-Datei, die Daten (Bilder) von SQL über eine gespeicherte Prozedur
Ich versuche zu exportieren eine ziemlich große Anzahl von Bild-Dateien, die intern gespeichert in einer SQL-Datenbank als binäre Daten.
Recht neue zu schreiben von gespeicherten Prozeduren in SQL habe ich über ein paar sehr nützliche Anleitungen, wie diese archiviert werden kann, aber ich scheine da etwas zu fehlen.
Ich bin mit SQL Server 2008 R2, lokal, und ich bin versucht zu schreiben, das Dateien in einen Ordner auf meinem Laufwerk C:\.
Hier ist die buisness Teil was ich habe, so weit:
BEGIN
DECLARE @cmd VARCHAR(8000)
DECLARE @result int
DECLARE curExportBinaryDocs CURSOR FAST_FORWARD FOR
SELECT 'BCP "SELECT Photograph_Data FROM [ALBSCH Trial].[dbo].[Photograph] WHERE Photograph_ID = '
+ CAST(Photograph_ID AS VARCHAR(500)) + '" queryout "' + @OutputFilePath
+ CAST(Photograph_ID AS VARCHAR(500)) + '.jpg"' + ' -n -T'
FROM dbo.Photograph
OPEN curExportBinaryDocs
FETCH NEXT FROM curExportBinaryDocs INTO @cmd
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT @cmd
EXEC @result = xp_cmdshell @cmd
FETCH NEXT FROM curExportBinaryDocs INTO @cmd
END
CLOSE curExportBinaryDocs
DEALLOCATE curExportBinaryDocs
END
'@result' wird immer auf '1' (fehlgeschlagen) nach dem Aufruf von xp_cmdshell. Alle die Namen der Tabellen/Felder richtig sind, so vermute ich es ist etwas falsch mit meinem BCP nennen, aber ich bin nicht sicher, was zu versuchen nächsten.
Jede Hilfe oder Beratung wäre sehr willkommen.
- Wie sind Sie mit dem SQL? Der SQL läuft unter Anmeldeinformationen eines Benutzers Bewirkt, dass der Benutzer über Rechte zum erstellen von Dateien im Ausgabe-Ordner?
- Ich bin Protokollierung in der SQL-server mit meinem üblichen windows-Benutzername und windows-Authentifizierung. Ich habe es geschafft, eine Lösung mithilfe der Methode hier beschrieben: stackoverflow.com/questions/1366544/..., aber wenn möglich würde ich gerne auf den Grund gehen, das problem habe ich mit meiner ursprünglichen Methode, nur für den Frieden des Geistes!
- Ich glaube, was du tust, ist ein bisschen schief. Wissen Sie über den SQL-Server die "Datei-stream-Datenbank aktivieren". Es ermöglicht Ihnen das speichern von BLOBs auf der Festplatte, während die BLOBs sind noch erhalten, von Ihrem SQL-Server. Nach stroing diese BLOBs auf der Festplatte, Ihre Anwendung muss nur eine Abfrage auf Ihre Datenbank und erhalten Sie das Objekt. Auch mit dem cursor ist nicht eine gute Sache (ist es langsam).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Naja, erstmal.. (und sorry 😉 ) DON ' T USE CURSOR..
und sorry für die caps...
Einer der am bösesten Dinge über Cursor, Sie können sperren Sie Ihre Tabelle. Was ich immer mache, für diese Zwecke (und das ist ziemlich schnell), habe ich eine for-Schleife verwenden.. so
Für den nächsten Teil, funktioniert der SQL Server-Prozess hat genug Schreibrechte auf Laufwerk c:? Sehen Sie sich auch in Ihrem Nachrichtenbereich, wenn Sie führen Sie Ihren code, vielleicht findest du dort etwas?
Was Sie auch tun können, versuchen Sie, führen Sie es manuell. Bekomme nur eine BCP-Anweisung, und führen Sie es mit xp_cmdshell. Bedeutet es gibt keine Fehler?
Hier ist meine Letzte Arbeit Verfahren und format-Datei. Ich war nicht in der Lage, die feineren details von dem,
BCP-Befehle, Genehmigung Einstellungen und format-Datei-layouts in einem Ort, so vielleicht wird dies von nutzen sein, um jemanden.
Format Datei:
Ich hoffe, dass hilft jemandem.
-N
Flagge auf der BCP-Befehlszeile.e:BCP "SELECT Data FROM [Photograph] WHERE ID=123;" queryout "123.jpg" -S localhost\SQLEXPRESS2008 -T -N