Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Exportieren einer Bildspalte in eine PDF-Datei in SQL Server?

Ich beantworte diese Frage, da ich einen schnelleren Weg gefunden habe.

Die Verwendung des Dienstprogramms bcp (Bulk Copy Program) über die Befehlszeile behält das native Dateiformat bei und ist sehr schnell. Die Ausgabedateien können auch in ein lokales Verzeichnis geschrieben werden. Außerdem können die Dateiformate bei Bedarf angepasst werden.

Bearbeiten:Hinzufügen einer detaillierteren Version der Antwort mit dem von mir verwendeten Code.

1) Legen Sie die erforderlichen Berechtigungen zum Ausführen von xp_cmdshell fest .

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

2) Exportieren Sie die Formatdatei für die Tabelle mit bcp

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

Ersetzen Sie -T mit -S servername -d databasename -U username -P password wenn Sie sich nicht mit integrierter Sicherheit mit der Datenbank verbinden.

3) Bearbeiten Sie nach einem erfolgreichen Export der Formatdatei diese, um alle anderen Spalten außer dem image zu entfernen oder varbinary Spalte.

Die Formatdatei sah anfangs so aus.

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

Ich habe die Datei wie unten bearbeitet.

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

4) Dann musste ich die Zeilen in der Tabelle durchlaufen, um die Bildspalte in jeder Zeile als Datei zu extrahieren. Ich habe eine temp table verwendet zu diesem Zweck.

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

Die oben beschriebenen Schritte können verwendet werden, um jede Art von Bild-/Varbinary-Dateien (gespeichert als pdf, docx usw.) aus der Datenbank zu extrahieren.