Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Експортиране на колона с изображение в pdf файл в sql сървър?

Отговарям на този въпрос, тъй като открих начин да го направя по-бързо.

Използването на помощната програма 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 и т.н.) от базата данни.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на персонализирано изображение на SQL Server Docker върху официалното изображение

  2. Как да се свържете с база данни от Unity

  3. Заявката за ROLLBACK TRANSACTION няма съответстваща BEGIN TRANSACTION

  4. PHP, ORM, MSSQL и Unicode, възможно ли е да ги накараме да работят заедно?

  5. Преобразуване от UniqueIdentifier в BigInt и обратно?