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?
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?
Antworten:
Dies ist die Lösung, die ich mir ausgedacht habe:
Aktivieren Sie xp_cmdshell
mit
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Erstellen Sie bei Bedarf ein Verzeichnis mit xp_cmdshell
, um die erforderlichen Berechtigungen zu erhalten.
EXEC master..xp_cmdshell 'mkdir C:\exportdir'
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]
2B 90 01 00
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.
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:
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
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
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
SQL 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.
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