Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Xuất một cột hình ảnh sang tệp pdf trong máy chủ sql?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Danh sách các loại dữ liệu trong SQL Server 2017

  2. Làm cách nào để lấy thông tin ngày / giờ từ cột TIMESTAMP?

  3. Chọn hàng đầu tiên cho mỗi nhóm

  4. Báo cáo SQL tổng theo năm, tìm kiếm một giải pháp thanh lịch

  5. SQL Server - sys.functions ở đâu?