Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Exporter une colonne d'image vers un fichier pdf sur un serveur sql ?

Je réponds à cette question car j'ai trouvé un moyen de le faire plus rapidement.

L'utilisation de l'utilitaire bcp (programme de copie en bloc) à partir de la ligne de commande préserve le format de fichier natif et est très rapide. Les fichiers de sortie peuvent également être écrits dans un répertoire local. De plus, les formats de fichiers peuvent être personnalisés si nécessaire.

Edit :Ajout d'une version plus détaillée de la réponse avec le code que j'ai utilisé.

1) Définissez les autorisations requises pour exécuter xp_cmdshell .

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

2) Exportez le fichier de format pour le tableau en utilisant bcp

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

Remplacer -T avec -S servername -d databasename -U username -P password si vous ne vous connectez pas à la base de données en utilisant la sécurité intégrée.

3) Après une exportation réussie du fichier de format, éditez-le pour supprimer toutes les autres colonnes sauf image ou varbinary colonne.

Le fichier de format ressemblait initialement à ceci.

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

J'ai édité le fichier comme ci-dessous.

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

4) Ensuite, j'ai dû parcourir les lignes du tableau pour extraire la colonne d'image de chaque ligne sous forme de fichier. J'ai utilisé une temp table à cet effet.

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

Les étapes décrites ci-dessus peuvent être utilisées pour extraire tout type de fichiers image/varbinary (stockés au format pdf, docx, etc.) de la base de données.