Ich beantworte diese Frage, da ich einen schnelleren Weg gefunden habe.
Die Verwendung des Dienstprogramms bcp (Bulk Copy Program) über die Befehlszeile behält das native Dateiformat bei und ist sehr schnell. Die Ausgabedateien können auch in ein lokales Verzeichnis geschrieben werden. Außerdem können die Dateiformate bei Bedarf angepasst werden.
Bearbeiten:Hinzufügen einer detaillierteren Version der Antwort mit dem von mir verwendeten Code.
1) Legen Sie die erforderlichen Berechtigungen zum Ausführen von xp_cmdshell
fest .
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell',1
GO
RECONFIGURE;
GO
2) Exportieren Sie die Formatdatei für die Tabelle mit bcp
bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt
Ersetzen Sie -T
mit -S servername -d databasename -U username -P password
wenn Sie sich nicht mit integrierter Sicherheit mit der Datenbank verbinden.
3) Bearbeiten Sie nach einem erfolgreichen Export der Formatdatei diese, um alle anderen Spalten außer dem image
zu entfernen oder varbinary
Spalte.
Die Formatdatei sah anfangs so aus.
11.0
17
1 SQLNCHAR 2 200 "" 1 Name SQL_Latin1_General_CP1_CI_AS
2 SQLNCHAR 2 1000 "" 2 Description SQL_Latin1_General_CP1_CI_AS
3 SQLUNIQUEID 1 16 "" 3 GUID ""
4 SQLBIT 1 1 "" 4 Enabled ""
5 SQLNCHAR 2 600 "" 5 ClassType SQL_Latin1_General_CP1_CI_AS
6 SQLINT 0 4 "" 6 PartitionID ""
7 SQLBIT 1 1 "" 7 Protected ""
8 SQLDATETIME 1 8 "" 8 LastModifiedTime ""
9 SQLINT 0 4 "" 9 LastModifiedByID ""
10 SQLINT 0 4 "" 10 ImageType ""
11 SQLBIT 1 1 "" 11 Template ""
12 SQLINT 0 4 "" 12 ObjectID ""
13 SQLBINARY 8 0 "" 13 Image --column of interest ""
14 SQLINT 0 4 "" 14 ParentId ""
15 SQLNCHAR 2 600 "" 15 ParentClassType SQL_Latin1_General_CP1_CI_AS
16 SQLBIT 1 1 "" 16 IsPrimary ""
17 SQLDATETIME 1 8 "" 17 ImageCaptureDate ""
Ich habe die Datei wie unten bearbeitet.
11.0
1
1 SQLBINARY 0 0 "" 1 Image ""
4) Dann musste ich die Zeilen in der Tabelle durchlaufen, um die Bildspalte in jeder Zeile als Datei zu extrahieren. Ich habe eine temp table
verwendet zu diesem Zweck.
IF OBJECT_ID('dbo.tmp_for_picture', 'U') IS NOT NULL
DROP TABLE tmp_for_picture
GO
select
row_number() over(order by parentid) as rownum
,i.image as image_column
,i.parentid
,replace(p.name,',','') as picture_file_name
,i.name
into tmp_for_picture
from Images i
join personnel p on p.ObjectID = i.ParentId
GO
declare @cnt int
declare @i int
declare @filename varchar(512)
declare @extension varchar(20)
declare @sql varchar(4000)
set @cnt = (select count(*) from Images i join personnel p on p.ObjectID = i.ParentId)
set @i = 1
set @extension = '.jpeg' --or extract the extension from a column in the table if available
while @i <= @cnt
begin
--print @i
set @filename = (select picture_file_name from tmp_for_picture where rownum = @i)
set @sql = 'bcp "select image_column from tmp_for_picture where rownum = '+str(@i)+'" queryout "F:\pictures\'[email protected][email protected]+'" -f formatfile.fmt -S servername -d databasename -T'
--print @sql
exec xp_cmdshell @sql
set @i = @i+1
end
GO
Die oben beschriebenen Schritte können verwendet werden, um jede Art von Bild-/Varbinary-Dateien (gespeichert als pdf, docx usw.) aus der Datenbank zu extrahieren.