Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Eksportujesz kolumnę obrazu do pliku pdf na serwerze sql?

Odpowiadam na to pytanie, ponieważ znalazłem sposób, aby zrobić to szybciej.

Korzystanie z narzędzia bcp (program do kopiowania zbiorczego) z wiersza poleceń zachowuje natywny format pliku i jest bardzo szybkie. Pliki wyjściowe można również zapisywać w katalogu lokalnym. Ponadto formaty plików można dostosować w razie potrzeby.

Edycja:dodanie bardziej szczegółowej wersji odpowiedzi z użytym kodem.

1) Ustaw wymagane uprawnienia do wykonania xp_cmdshell .

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

2) Wyeksportuj plik formatu tabeli za pomocą bcp

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

Zastąp -T z -S servername -d databasename -U username -P password jeśli nie łączysz się z bazą danych za pomocą zintegrowanych zabezpieczeń.

3) Po pomyślnym wyeksportowaniu pliku formatu edytuj go, aby usunąć wszystkie inne kolumny z wyjątkiem image lub varbinary kolumna.

Plik formatu początkowo wyglądał tak.

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

Edytowałem plik jak poniżej.

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

4) Następnie musiałem przejść przez wiersze w tabeli, aby wyodrębnić kolumnę obrazu w każdym wierszu jako plik. Użyłem temp table w tym celu.

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
 

Opisane powyżej kroki można wykorzystać do wyodrębnienia dowolnego typu plików graficznych/zmiennych (przechowywanych jako pdf, docx itp.) z bazy danych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupuj według kolumny i wielu wierszy w jeden wiersz wiele kolumn

  2. Jak dodać lub upuścić kolumnę z tabeli włączonej usługi CDC bez utraty danych w bazie danych programu SQL Server — samouczek programu SQL Server

  3. Problemy z wydajnością parametru wartości tabeli

  4. SQL Server 2016:Utwórz bazę danych

  5. Skąd mam wiedzieć, kiedy zakończono wypełnianie indeksu pełnotekstowego SQL?