sql >> Database >  >> RDS >> Sqlserver

Een afbeeldingskolom exporteren naar een pdf-bestand in de sql-server?

Ik beantwoord deze vraag omdat ik een manier heb gevonden om het sneller te doen.

Het gebruik van het bcp-hulpprogramma (bulkkopieprogramma) vanaf de opdrachtregel behoudt het oorspronkelijke bestandsformaat en is erg snel. De uitvoerbestanden kunnen ook naar een lokale map worden geschreven. De bestandsindelingen kunnen indien nodig ook worden aangepast.

Bewerken:een meer gedetailleerde versie van het antwoord toevoegen met de code die ik heb gebruikt.

1) Stel de vereiste rechten in om xp_cmdshell uit te voeren .

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

2) Exporteer het formaatbestand voor de tabel met bcp

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

Vervang -T met -S servername -d databasename -U username -P password als u geen verbinding maakt met de database via geïntegreerde beveiliging.

3) Na een succesvolle export van het formaatbestand, bewerk het om alle andere kolommen te verwijderen behalve de image of varbinary kolom.

Het formaatbestand zag er aanvankelijk zo uit.

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

Ik heb het bestand zoals hieronder bewerkt.

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

4) Vervolgens moest ik door de rijen in de tabel bladeren om de afbeeldingskolom in elke rij als een bestand te extraheren. Ik gebruikte een temp table voor dit doel.

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 hierboven beschreven stappen kunnen worden gebruikt om elk type afbeelding/varbinary-bestanden (opgeslagen als pdf, docx enz.) uit de database te extraheren.




  1. Haal een record op op de maximale datum van elke maand

  2. Fouten negeren met psql \copy meta-command

  3. Vraagteken negeren als tijdelijke aanduiding bij gebruik van PDO met PostgreSQL

  4. Hoe een-op-veel relaties naar XML te renderen met PostgreSQL