Wie exportiere ich eine Bildspalte in Dateien in SQL Server?

13

Ich werde von einer Datenbank migrieren. Es gibt eine Spalte vom Typ image, die ich in Binärdateien im Dateisystem exportieren möchte. Eine Datei für jeden Datensatz. Wie kann ich das mit SQL Server machen?

Jonas
quelle
1
Ein guter Beitrag von Amna Asif sqlcache.blogspot.com/2014/09/…
aasim.abdullah
1
Ich würde wahrscheinlich einen einfachen SSIS-Datenfluss mit einer Transformation für
Martin Smith,

Antworten:

13

Dies ist die Lösung, die ich mir ausgedacht habe:

  1. Aktivieren Sie xp_cmdshellmit

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. Erstellen Sie bei Bedarf ein Verzeichnis mit xp_cmdshell, um die erforderlichen Berechtigungen zu erhalten.

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. Verwenden Sie BCP mit queryout

    EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -N'

** your_db muss der vollständig qualifizierte Tabellenname sein, dh [Yourdb]. [YourSchema]. [YourTable]

Jonas
quelle
1
Ich habe den obigen Code ausprobiert und es hat tatsächlich funktioniert ... bis zu einem gewissen Punkt. Aus irgendeinem Grund enthält das JPG-Bild 4 vorangestellte Zeichen, die dazu führen, dass es ungültig wird. Ich habe diese mit einem Texteditor und voila entfernt ... JPG hat funktioniert. Irgendeine Idee, was diese 4 Charaktere sein könnten und wie man sie beim Export loswird? Sie sind:2B 90 01 00
Was ist der Typ der Spalte, aus der Sie exportiert haben?
Max Vernon
10

Ich hatte das gleiche Problem mit den zusätzlichen 4 Bytes, die am Anfang aller meiner Dateien hinzugefügt wurden. Anstatt die Option -N in meinem Befehl bcp zu verwenden, habe ich sie in -C RAW geändert. Wenn Sie dies tun, wird bcp mit den folgenden Fragen aufgefordert:

Geben Sie den Dateityp des Feldes FileData [Bild] ein:
Geben Sie die Präfixlänge des Feldes FileData [4] ein:
Geben Sie die Länge des Feldes FileData [0] ein:
Feldabschluss eingeben [keine]: 
Möchten Sie diese Formatinformationen in einer Datei speichern? [J / n]

Um dies zu beheben, habe ich eine Textdatei (i.txt) im Stammverzeichnis meines SQL-Servers erstellt, die die folgenden Zeilen enthält, um diese zu beantworten:

ich
0
0

n

Dann wurde meine EXEC bcp-Zeile:

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db WHERE id = 1" queryout "C: \ exportdir \ yourfile.pdf" -T-RAW <C: \ i.txt "

Dadurch wurde meine Datei ohne die zusätzlichen Zeichen exportiert.

Jacob Dababneh
quelle
2

Ich war auf der Suche nach einer Lösung zum Exportieren einer IMAGE-Spalte, in der verschiedene Dateitypen (pdf, xls, doc, xml ...) gespeichert sind, die ich exportieren möchte.

Der Ansatz in der Antwort galt nur für PDF-Dateien. Um alle Arten von Dateien zu exportieren, musste ich die Lösung wie folgt anpassen:

(1.) Erstellen Sie eine Formatvorlagendatei:

Declare @sql varchar(500); 
Declare @sql varchar(500); 
SET @sql = 'bcp db.dbo.ImgTable format nul -T -n -f C:\tmp\export.fmt -S ' + @@SERVERNAME; 
select @sql;  
EXEC master.dbo.xp_CmdShell @sql; 

(2.) Öffnen Sie die erstellte Exportformatdatei und bearbeiten Sie sie folgendermaßen:

10.0
1
1       SQLIMAGE            0       0       ""   1     img_col                                     ""

Führen Sie dann Ihren Exportbefehl aus:

EXEC master..xp_cmdshell 'BCP "SELECT IMG_COL FROM db.dbo.ImgTable WHERE id = ''CAB240C0-0068-4041-AA34-0000ECB42DDD'' " queryout "C:\tmp\myFile.xml" -T -f C:\tmp\export.fmt -S '

(3.) Falls Sie auf diesen Fehler stoßen (wie ich):

"[Microsoft] [SQL Native Client] Host-Dateispalten werden möglicherweise nur beim Kopieren auf den Server übersprungen."

Stellen Sie Folgendes sicher:

  • Vergessen Sie nicht, die zweite Zeile zu bearbeiten, und geben Sie hier die Anzahl der Einträge ein (1 in diesem Szenario)!
  • Stellen Sie sicher, dass Sie eine CRLF am Ende der letzten Zeile haben, ohne diese hat es nicht funktioniert!

Danach wird das Exportieren eines beliebigen IMAGE-Column-Dateiworts ohne Fehler durchgeführt.

Die Tribute für 1. und 2. richten sich an die Antwort auf die folgende Frage: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947

Magier
quelle
1

Wenn Sie keine Probleme mit einer GUI-Lösung haben, gibt es ein wirklich tolles Add-In für SSMS SSMSBoost , das viele nützliche Funktionen bietet und natürlich die einfachste Möglichkeit, in SQL gespeicherte Bilder in der Vorschau anzuzeigen (zumindest meiner Meinung nach).

ANMERKUNG : Sie müssen SSMS nach der Installation dieses Add-Ins neu starten.

Installieren Sie es und genießen Sie die Vorschau von Bildern mit: Rechtsklick> Visualisieren als> Bild

Abs
quelle
0
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'

Halten Sie den Befehl auf EINER LINIE - EINZELNE LINIE !!!

SET @Command = 'bcp "SELECT Member_Picture FROM dbserver.[Member_Image] WHERE memberId = 1 " queryout "D:\Project\Member\Images\member1.jpg" -T -N ' 
PRINT @Command -- debugging
EXEC xp_cmdshell   @Command
GO
ARYA
quelle
Auf einigen Servern ist xp_cmdshell deaktiviert und Sie erhaltenSQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.
JustAMartin
-2
USE [POC]
DECLARE @outPutPath varchar(50) = 'C:\Extract_Photos'
, @i bigint
, @init int
, @data varbinary(max)
, @fPath varchar(max)
, @folderPath  varchar(max)

--Get Data into temp Table variable so that we can iterate over it
DECLARE @Doctable TABLE (id int identity(1,1), [Doc_Num]  varchar(100) , [FileName]  varchar(100), [Doc_Content] varBinary(max) )

INSERT INTO @Doctable([Doc_Num] , [FileName],[Doc_Content])
Select [STUDENTNO] , [STUDENTNAME],[STUDENTPHOTO] FROM  [dbo].[STUDENTPHOTOS]

--SELECT * FROM @table

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN

    SELECT
     @data = [Doc_Content],
     @fPath = @outPutPath + '\'+ [Doc_Num] + '\' +[FileName],
     @folderPath = @outPutPath + '\'+ [Doc_Num]
    FROM @Doctable WHERE id = @i

  --Create folder first
  EXEC  [dbo].[CreateFolder]  @folderPath

  EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
  EXEC sp_OASetProperty @init, 'Type', 1;
  EXEC sp_OAMethod @init, 'Open'; -- Calling a method
  EXEC sp_OAMethod @init, 'Write', NULL, @data; -- Calling a method
  EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; -- Calling a method
  EXEC sp_OAMethod @init, 'Close'; -- Calling a method
  EXEC sp_OADestroy @init; -- Closed the resources

  print 'Document Generated at - '+  @fPath

--Reset the variables for next use
SELECT @data = NULL
, @init = NULL
, @fPath = NULL
, @folderPath = NULL
SET @i -= 1
END
erax
quelle
Bitte ändere deinen Beitrag, indem du erklärst, was dieser Code bewirken soll.
Dezso
Danke Erax für das Skript, es hat wunderbar funktioniert. PS: Das Skript kann die Datei nicht extrahieren, wenn es remote mit SSMS ausgeführt wird. Es musste direkt auf dem SQLServer ausgeführt werden, damit der Anhang abgerufen werden konnte.
Vaas