Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Esportare una colonna immagine in un file pdf nel server sql?

Sto rispondendo a questa domanda perché ho scoperto un modo per farlo più velocemente.

L'utilizzo dell'utilità bcp (programma di copia in blocco) dalla riga di comando preserva il formato file nativo ed è molto veloce. I file di output possono anche essere scritti in una directory locale. Inoltre, i formati dei file possono essere personalizzati, se necessario.

Modifica:aggiunta di una versione più dettagliata della risposta con il codice che ho usato.

1) Imposta le autorizzazioni richieste per eseguire xp_cmdshell .

EXEC sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO
EXEC sp_configure 'xp_cmdshell',1  
GO  
RECONFIGURE;  
GO

2) Esportare il file di formato per la tabella utilizzando bcp

bcp schemaname.tablename format nul -T -n -f format_file_tablename.fmt

Sostituisci -T con -S servername -d databasename -U username -P password se non ti connetti al database utilizzando la sicurezza integrata.

3) Dopo un'esportazione riuscita del file in formato, modificalo per rimuovere tutte le altre colonne tranne l'image o varbinary colonna.

Inizialmente il file di formato era simile a questo.

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                     ""

Ho modificato il file come di seguito.

11.0
1
1      SQLBINARY           0       0       ""   1    Image                                ""

4) Quindi ho dovuto scorrere le righe nella tabella per estrarre la colonna dell'immagine in ogni riga come file. Ho usato una temp table a questo scopo.

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

I passaggi sopra descritti possono essere utilizzati per estrarre qualsiasi tipo di file immagine/varbinary (memorizzati come pdf,docx ecc.) dal database.