Comment exporter une colonne d'image vers des fichiers dans SQL Server?


13

Je vais migrer depuis une base de données. Il y a une colonne de type imageque j'aimerais exporter vers des fichiers binaires sur le système de fichiers. Un fichier pour chaque enregistrement. Comment puis-je faire cela avec SQL Server?


1
Un bon article par Amna Asif sqlcache.blogspot.com/2014/09/…
aasim.abdullah

1
Je ferais probablement un simple flux de données SSIS avec une transformation de colonne d'exportation
Martin Smith

Réponses:


13

Voici la solution que j'ai trouvée:

  1. Activer xp_cmdshellavec

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. Si nécessaire, créez un répertoire avec xp_cmdshell pour obtenir les autorisations nécessaires.

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. Utiliser BCP avec queryout

    EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -N'

** your_db doit être le nom de table complet, c'est-à-dire [Yourdb]. [YourSchema]. [YourTable]


1
J'ai essayé le code ci-dessus et cela a effectivement fonctionné ... jusqu'à un certain point. Pour une raison quelconque, l'image JPG a 4 caractères précédents qui la rendent invalide. Je les ai supprimés avec un éditeur de texte et le tour est joué ... JPG a fonctionné. Une idée de ce que pourraient être ces 4 personnages et comment s'en débarrasser à l'export? Ils sont:2B 90 01 00

Quel est le type de la colonne à partir de laquelle vous avez exporté?
Max Vernon

10

J'ai eu le même problème avec l'ajout de 4 octets supplémentaires au début de tous mes fichiers. Au lieu d'utiliser l'option -N dans ma commande bcp, je l'ai changé en -C RAW. Lorsque vous effectuez cette opération, bcp sera invité à répondre aux questions suivantes:

Entrez le type de stockage de fichiers du champ FileData [image]:
Entrez la longueur du préfixe du champ FileData [4]:
Entrez la longueur du champ FileData [0]:
Entrez le terminateur de champ [aucun]: 
Voulez-vous enregistrer ces informations de format dans un fichier? [O / n]

Pour résoudre ce problème, j'ai créé un fichier texte (i.txt) à la racine de mon serveur sql qui contenait les lignes suivantes pour répondre à chacun d'eux:

je
0
0

n

Ensuite, ma ligne bcp EXEC est devenue:

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db WHERE id = 1" queryout "C: \ exportdir \ yourfile.pdf" -T -C RAW <C: \ i.txt'

Cela a exporté mon fichier sans aucun des caractères supplémentaires.


2

Je suis venu à la recherche d'une solution pour exporter une colonne IMAGE ayant stocké différents types de fichiers (pdf, xls, doc, xml ...) que je souhaite exporter.

L'approche de la réponse ne fonctionnait que pour les fichiers pdf. Pour exporter toutes sortes de fichiers, j'ai dû ajuster la solution comme suit:

(1.) Créez un fichier de modèle de format:

Declare @sql varchar(500); 
Declare @sql varchar(500); 
SET @sql = 'bcp db.dbo.ImgTable format nul -T -n -f C:\tmp\export.fmt -S ' + @@SERVERNAME; 
select @sql;  
EXEC master.dbo.xp_CmdShell @sql; 

(2.) Ouvrez le fichier de format d'exportation créé et modifiez-le de cette façon:

10.0
1
1       SQLIMAGE            0       0       ""   1     img_col                                     ""

Exécutez ensuite votre commande d'exportation:

EXEC master..xp_cmdshell 'BCP "SELECT IMG_COL FROM db.dbo.ImgTable WHERE id = ''CAB240C0-0068-4041-AA34-0000ECB42DDD'' " queryout "C:\tmp\myFile.xml" -T -f C:\tmp\export.fmt -S '

(3.) Si vous rencontrez cette erreur (comme je l'ai fait):

"[Microsoft] [SQL Native Client] Les colonnes du fichier hôte peuvent être ignorées uniquement lors de la copie sur le serveur"

assurez-vous que les éléments suivants:

  • assurez-vous que vous n'avez pas oublié de modifier la deuxième ligne et entrez le nombre d'entrées ici (1 dans ce scénario)!
  • assurez-vous d'avoir un CRLF à la fin de la dernière ligne, sans cela cela n'a pas fonctionné!

Après cela, l'exportation de tout mot de fichier de colonne IMAGE sans erreur.

Hommages pour 1. et 2. tout va à la réponse de la question suivante: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947


1

Si vous n'avez aucun problème avec une solution GUI, il existe un très bon complément pour SSMS SSMSBoost qui fournit de nombreuses fonctionnalités utiles, et bien sûr le moyen le plus simple de prévisualiser les images stockées en SQL (du moins à mon avis)

REMARQUE : vous devez redémarrer SSMS après avoir installé ce complément.

Installez-le et profitez de la prévisualisation des images simplement avec: Clic droit> Visualiser comme> Image


0
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'

Gardez la commande sur UNE LIGNE - UNE LIGNE !!!

SET @Command = 'bcp "SELECT Member_Picture FROM dbserver.[Member_Image] WHERE memberId = 1 " queryout "D:\Project\Member\Images\member1.jpg" -T -N ' 
PRINT @Command -- debugging
EXEC xp_cmdshell   @Command
GO

Sur certains serveurs, xp_cmdshell est désactivé et vous obtenezSQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.
JustAMartin

-2
USE [POC]
DECLARE @outPutPath varchar(50) = 'C:\Extract_Photos'
, @i bigint
, @init int
, @data varbinary(max)
, @fPath varchar(max)
, @folderPath  varchar(max)

--Get Data into temp Table variable so that we can iterate over it
DECLARE @Doctable TABLE (id int identity(1,1), [Doc_Num]  varchar(100) , [FileName]  varchar(100), [Doc_Content] varBinary(max) )

INSERT INTO @Doctable([Doc_Num] , [FileName],[Doc_Content])
Select [STUDENTNO] , [STUDENTNAME],[STUDENTPHOTO] FROM  [dbo].[STUDENTPHOTOS]

--SELECT * FROM @table

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN

    SELECT
     @data = [Doc_Content],
     @fPath = @outPutPath + '\'+ [Doc_Num] + '\' +[FileName],
     @folderPath = @outPutPath + '\'+ [Doc_Num]
    FROM @Doctable WHERE id = @i

  --Create folder first
  EXEC  [dbo].[CreateFolder]  @folderPath

  EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
  EXEC sp_OASetProperty @init, 'Type', 1;
  EXEC sp_OAMethod @init, 'Open'; -- Calling a method
  EXEC sp_OAMethod @init, 'Write', NULL, @data; -- Calling a method
  EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; -- Calling a method
  EXEC sp_OAMethod @init, 'Close'; -- Calling a method
  EXEC sp_OADestroy @init; -- Closed the resources

  print 'Document Generated at - '+  @fPath

--Reset the variables for next use
SELECT @data = NULL
, @init = NULL
, @fPath = NULL
, @folderPath = NULL
SET @i -= 1
END

Veuillez modifier votre message en expliquant ce que ce code est censé faire.
dezso

Merci Erax pour le script qui a fonctionné à merveille. PS: le script ne parvient pas à extraire le fichier s'il est exécuté à distance à l'aide de SSMS. Il devait être exécuté directement sur le serveur SQL pour qu'il tire la pièce jointe.
Vaas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.