Tôi đang trả lời câu hỏi này vì tôi đã tìm ra cách để làm điều đó nhanh hơn.
Sử dụng tiện ích bcp (chương trình sao chép hàng loạt) từ dòng lệnh sẽ giữ nguyên định dạng tệp gốc và rất nhanh. Các tệp đầu ra cũng có thể được ghi vào một thư mục cục bộ. Ngoài ra, các định dạng tệp có thể được tùy chỉnh nếu cần.
Chỉnh sửa:Thêm phiên bản chi tiết hơn của câu trả lời với mã tôi đã sử dụng.
1) Đặt các quyền cần thiết để thực thi xp_cmdshell
.
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'xp_cmdshell',1
GO
RECONFIGURE;
GO
2) Xuất tệp định dạng cho bảng bằng bcp
bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt
Thay thế -T
với -S servername -d databasename -U username -P password
nếu bạn không kết nối với cơ sở dữ liệu bằng bảo mật tích hợp.
3) Sau khi xuất thành công tệp định dạng, hãy chỉnh sửa tệp đó để xóa tất cả các cột khác ngoại trừ image
hoặc varbinary
cột.
Tệp định dạng ban đầu trông giống như thế này.
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 ""
Tôi đã chỉnh sửa tệp như dưới đây.
11.0
1
1 SQLBINARY 0 0 "" 1 Image ""
4) Sau đó, tôi phải lặp qua các hàng trong bảng để trích xuất cột hình ảnh trong mỗi hàng dưới dạng tệp. Tôi đã sử dụng temp table
cho mục đích này.
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
Các bước được mô tả ở trên, có thể được sử dụng để trích xuất bất kỳ loại tệp hình ảnh / varbinary nào (được lưu trữ dưới dạng pdf, docx, v.v.) từ cơ sở dữ liệu.