2009-09-02 10 views
10

J'utilise Microsoft SQL Server Management Studio pour me connecter à une base de données. Dans celui-ci j'ai une table, dont une colonne est une colonne Image contenant des données de fichier. Une autre colonne est une chaîne contenant le nom du fichier.Comment exporter le champ d'image dans un fichier?

Y a-t-il un moyen d'écrire un script sql qui me permettra de sélectionner un enregistrement et d'écrire ces données dans un fichier? Ou si ce n'est pas possible, comment y parvenir?

J'ai vu cette question connexe, mais il ne semble pas tout à fait le même: Save image column to file in sql-server 2000

Répondre

25
-- Write all database images (jpg) to file. 
--------- --------- --------- --------- --------- --------- --------- 
DECLARE CURSOR_ProductIds CURSOR FOR (SELECT ImgImagesId FROM ImgProductSample) 

DECLARE @ProductId INT; 

OPEN CURSOR_ProductIds 

FETCH NEXT FROM CURSOR_ProductIds INTO @ProductId 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
    DECLARE @ImageData varbinary(max); 
    SELECT @ImageData = (SELECT convert(varbinary(max), ImageData, 1) FROM ProductImages WHERE Id = @ProductId); 

    DECLARE @Path nvarchar(1024); 
    SELECT @Path = 'C:\MyImages\Output'; 

    DECLARE @Filename NVARCHAR(1024); 
    SELECT @Filename = (SELECT ImageFilename FROM ProductImages WHERE id = @ProductId); 

    DECLARE @FullPathToOutputFile NVARCHAR(2048); 
    SELECT @FullPathToOutputFile = @Path + '\' + @Filename; 

    DECLARE @ObjectToken INT 
    EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT; 
    EXEC sp_OASetProperty @ObjectToken, 'Type', 1; 
    EXEC sp_OAMethod @ObjectToken, 'Open'; 
    EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @ImageData; 
    EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2; 
    EXEC sp_OAMethod @ObjectToken, 'Close'; 
    EXEC sp_OADestroy @ObjectToken; 

    FETCH NEXT FROM CURSOR_ProductIds INTO @ProductId 
END 
CLOSE CURSOR_ProductIds 
DEALLOCATE CURSOR_ProductIds 

-- Make sure the following statement is executed to enable file IO 
-- From http://msdn.microsoft.com/en-us/library/ms191188.aspx 
--------- --------- --------- --------- --------- --------- --------- 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 
+0

Msg 8152, niveau 16, état 10, ligne 7 Les données chaîne ou binaires sont tronquées. –

2
-- Write database image (jpg) to file 
-- http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=101754 
--------- --------- --------- --------- --------- --------- --------- 
DECLARE @ImageData varbinary(max); 
SELECT @ImageData = (SELECT convert(varbinary(max), ImageData, 1) FROM ProductImages WHERE Id = 1); 

DECLARE @Path nvarchar(1024); 
SELECT @Path = 'C:\MyImages\Output'; 

DECLARE @Filename NVARCHAR(1024); 
SELECT @Filename = (SELECT ImageFilename FROM ProductImages WHERE id = 1); 

DECLARE @FullPathToOutputFile NVARCHAR(2048); 
SELECT @FullPathToOutputFile = @Path + '\' + @Filename; 

DECLARE @ObjectToken INT 
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT; 
EXEC sp_OASetProperty @ObjectToken, 'Type', 1; 
EXEC sp_OAMethod @ObjectToken, 'Open'; 
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @ImageData; 
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2; 
EXEC sp_OAMethod @ObjectToken, 'Close'; 
EXEC sp_OADestroy @ObjectToken; 

-- Make sure the following statement is executed to enable file IO 
-- From http://msdn.microsoft.com/en-us/library/ms191188.aspx 
--------- --------- --------- --------- --------- --------- --------- 
sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 

PS - Le lien vers l'article « Lecture et écriture de fichiers dans SQL Server à l'aide de T-SQL » était utile mais après que j'ai eu le morceau de code fonctionnant il a produit un fichier d'image invalide.

+0

@mathijusuitmegan Je suis confronté à cette question: Msg 8152, niveau 16, état 10, ligne 7 chaîne ou Les données binaires seraient tronquées. –

5

De mkader à codeproject:

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

de vidage ensuite un fichier de format:

Declare @sql varchar(500) 
SET @sql = 'bcp DBName.dbo.tblTableName format nul -T -n -f C:\testblob.fmt -S ' + @@SERVERNAME 
select @sql 
EXEC master.dbo.xp_CmdShell @sql 

Mon fichier de format ressemblait à ceci:

10.0 
12 
1  SQLINT    0  4  "" 1  my_tablecol_id         "" 
2  SQLINT    1  4  "" 2  my_tablecol0         "" 
3  SQLCHAR    2  256  "" 3  my_tablecol1        SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR    2  256  "" 4  my_tablecol2        SQL_Latin1_General_CP1_CI_AS 
5  SQLCHAR    2  256  "" 5  my_tablecol3       SQL_Latin1_General_CP1_CI_AS 
6  SQLCHAR    2  2048 "" 6  my_tablecol4        SQL_Latin1_General_CP1_CI_AS 
7  SQLIMAGE   4  0  "" 7  my_imagecol          "" 
8  SQLCHAR    2  2048 "" 8  my_tablecol6       SQL_Latin1_General_CP1_CI_AS 
9  SQLINT    1  4  "" 9  my_tablecol7          "" 
10  SQLINT    1  4  "" 10 my_tablecol8         "" 
11  SQLINT    1  4  "" 11 my_tablecol9        "" 
12  SQLBIT    1  1  "" 12 my_tablecol10        "" 

J'edited alors la fichier de format comme ceci:

10.0 
1 
1  SQLIMAGE   0  0  "" 1  my_imagecol          "" 

Et puis a couru ce SQL dans SSMS:

Declare @mynum int 
Declare @sql varchar(500) 
SET @mynum = 49 -- something meaningful only to me 
SET @sql = 'BCP "SELECT my_imagecol FROM DBName.dbo.tblTableName where [email protected]" QUERYOUT C:\myfilename.docx -T -fC:\testblob.fmt -S ' + @@SERVERNAME 
EXEC master.dbo.xp_CmdShell @sql 

Cela a fonctionné très bien, tout type de données dans la colonne d'image fonctionne.

+0

Merci! Le fichier de format était ce dont j'avais besoin pour que cela fonctionne. –

0

Je sais que c'est plus de 2 ans, je voulais toujours poster, car il pourrait aider quelqu'un. Si nous voulons exporter des images avec les autres colonnes (y compris les symboles) d'une table de base de données vers un fichier, afin qu'elles puissent être importées dans un autre SQL Server, cela est très pratique.

Le code ci-dessous exportera la table de base de données spécifiée vers le chemin de fichier de votre choix.

Declare @sql varchar(500) 
SET @sql = 'bcp Your_db.Your_table out Your_File_Path(eg: C:\ImagesNames.Dat) -w -T -S ' + @@SERVERNAME 
EXEC @sql 

Le commutateur -w est un fichier de données au format Unicode et le séparateur sera le séparateur onglet par défaut si nous ne précisons pas delimiter. Dans ce cas, le fichier de données est enregistré avec une extension dat. Peut-être que ça pourrait aussi être sauvegardé dans d'autres formats, mais je ne l'ai pas testé, alors que celui-ci fonctionne parfaitement.

https://msdn.microsoft.com/en-gb/library/ms188289(v=sql.110).aspx

Ensuite, pour l'importation:

BULK INSERT Your_db.Your_table 
    FROM 'Your_File_Path' 
with (DATAFILETYPE='widechar') 

Ceci importe le fichier de données très efficace dans la table de base de données spécifiée.

-2

Solution adaptée par mathijsuitmegen et cela a parfaitement fonctionné pour moi:

Code1

Code2

+0

Je vous suggère de copier le texte au lieu de l'image. Sinon ce n'est pas vraiment agréable à lire. – Carol

Questions connexes