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

Eksportere en billedkolonne til en pdf-fil i sql-server?

Jeg besvarer dette spørgsmål, da jeg fandt ud af en måde at gøre det hurtigere på.

Brug af værktøjet bcp (bulk copy program) fra kommandolinjen bevarer det oprindelige filformat og er meget hurtigt. Outputfilerne kan også skrives til en lokal mappe. Filformaterne kan også tilpasses efter behov.

Rediger:Tilføjelse af en mere detaljeret version af svaret med den kode, jeg brugte.

1) Indstil de nødvendige tilladelser til at udføre xp_cmdshell .

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

2) Eksporter formatfilen til tabellen ved hjælp af bcp

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

Erstat -T med -S servername -d databasename -U username -P password hvis du ikke opretter forbindelse til databasen ved hjælp af integreret sikkerhed.

3) Efter en vellykket eksport af formatfilen, rediger den for at fjerne alle de andre kolonner undtagen image eller varbinary kolonne.

Formatfilen så først sådan ud.

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

Jeg redigerede filen som nedenfor.

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

4) Så var jeg nødt til at gå gennem rækkerne i tabellen for at udtrække billedkolonnen i hver række som en fil. Jeg brugte en temp table til dette formå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 ovenfor beskrevne trin kan bruges til at udtrække enhver type billed-/variationsfiler (gemt som pdf, docx osv.) fra databasen.




  1. Hvordan løses java.lang.ClassNotFoundException:oracle.jdbc.driver.OracleDriver under runtime?

  2. Hvordan man bruger pqxx::stateless_cursor klasse fra libpqxx?

  3. Hvordan genererer man næste automatiske stigningsnummer i mysql ved hjælp af php?

  4. TEXT vs VARCHAR i InnoDB MySQL 5.5. Hvornår skal man bruge hver enkelt