sql >> Databasteknik >  >> RDS >> Sqlserver

Exportera en bildkolumn till en pdf-fil i sql-server?

Jag svarar på den här frågan eftersom jag hittade ett sätt att göra det snabbare.

Att använda bcp (bulk copy program) från kommandoraden bevarar det ursprungliga filformatet och är mycket snabbt. Utdatafilerna kan också skrivas till en lokal katalog. Filformaten kan också anpassas vid behov.

Edit:Lägger till en mer detaljerad version av svaret med koden jag använde.

1) Ställ in nödvändiga behörigheter för att köra xp_cmdshell .

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

2) Exportera formatfilen för tabellen med bcp

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

Ersätt -T med -S servername -d databasename -U username -P password om du inte ansluter till databasen med integrerad säkerhet.

3) Efter en lyckad export av formatfilen, redigera den för att ta bort alla andra kolumner utom image eller varbinary kolumn.

Formatfilen såg ut så här från början.

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

Jag redigerade filen som nedan.

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

4) Sedan var jag tvungen att gå igenom raderna i tabellen för att extrahera bildkolumnen i varje rad som en fil. Jag använde en temp table för detta ändamål.

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

De steg som beskrivs ovan kan användas för att extrahera alla typer av bild-/variantfiler (lagrade som pdf, docx etc.) från databasen.




  1. MariaDB JSON_MERGE() Förklarad

  2. Importera data från Excel till MySql med Node JS

  3. Introduktion till PL/SQL-samlingar i Oracle Database

  4. SQL Server List Tabeller:Hur man visar alla tabeller