Jag svarar på den här frågan eftersom jag hittade ett sätt att göra det snabbare.
Att använda bcp (bulk copy program) från kommandoraden bevarar det ursprungliga filformatet och är mycket snabbt. Utdatafilerna kan också skrivas till en lokal katalog. Filformaten kan också anpassas vid behov.
Edit:Lägger till en mer detaljerad version av svaret med koden jag använde.
1) Ställ in nödvändiga behörigheter för att köra xp_cmdshell
.
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell',1
GO
RECONFIGURE;
GO
2) Exportera formatfilen för tabellen med bcp
bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt
Ersätt -T
med -S servername -d databasename -U username -P password
om du inte ansluter till databasen med integrerad säkerhet.
3) Efter en lyckad export av formatfilen, redigera den för att ta bort alla andra kolumner utom image
eller varbinary
kolumn.
Formatfilen såg ut så här från början.
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 ""
Jag redigerade filen som nedan.
11.0
1
1 SQLBINARY 0 0 "" 1 Image ""
4) Sedan var jag tvungen att gå igenom raderna i tabellen för att extrahera bildkolumnen i varje rad som en fil. Jag använde en temp table
för detta ändamål.
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
De steg som beskrivs ovan kan användas för att extrahera alla typer av bild-/variantfiler (lagrade som pdf, docx etc.) från databasen.