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.