Отговарям на този въпрос, тъй като открих начин да го направя по-бързо.
Използването на помощната програма bcp (програма за групово копиране) от командния ред запазва основния файлов формат и е много бързо. Изходните файлове могат да бъдат записани и в локална директория. Освен това файловите формати могат да бъдат персонализирани, ако е необходимо.
Редактиране:Добавяне на по-подробна версия на отговора с кода, който използвах.
1) Задайте необходимите разрешения за изпълнение на xp_cmdshell
.
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell',1
GO
RECONFIGURE;
GO
2) Експортирайте файла с формат за таблицата с помощта на bcp
bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt
Заменете -T
с -S servername -d databasename -U username -P password
ако не се свържете с базата данни чрез интегрирана защита.
3) След успешно експортиране на файла с формат, редактирайте го, за да премахнете всички други колони с изключение на image
или varbinary
колона.
Първоначално форматираният файл изглеждаше така.
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 ""
Редактирах файла, както е показано по-долу.
11.0
1
1 SQLBINARY 0 0 "" 1 Image ""
4) След това трябваше да превъртя редовете в таблицата, за да извлека графична колона във всеки ред като файл. Използвах temp table
за тази цел.
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
Стъпките, описани по-горе, могат да се използват за извличане на всякакъв тип изображения/варбинарни файлове (съхранени като pdf, docx и т.н.) от базата данни.