¿Cómo exportar una columna de imagen a archivos en SQL Server?


13

Migraré desde una base de datos. Hay una columna de tipo imageque me gustaría exportar a archivos binarios en el sistema de archivos. Un archivo para cada registro. ¿Cómo puedo hacer esto con SQL Server?


1
Una buena publicación de Amna Asif sqlcache.blogspot.com/2014/09/…
aasim.abdullah

1
Probablemente interrumpiría un simple flujo de datos SSIS con una transformación de columna de exportación
Martin Smith

Respuestas:


13

Esta es la solución que se me ocurrió:

  1. Habilitar xp_cmdshellcon

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. Si es necesario, cree un directorio con xp_cmdshellpara obtener los permisos necesarios.

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. Use BCP con 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 debe ser el nombre completo de la tabla, es decir, [Yourdb]. [YourSchema]. [YourTable]


1
Intenté el código anterior y de hecho funcionó ... hasta cierto punto. Por alguna razón, la imagen JPG tiene 4 caracteres anteriores que hacen que no sea válida. Los eliminé con un editor de texto y listo ... JPG funcionó. ¿Alguna idea de cuáles podrían ser estos 4 personajes y cómo deshacerse de ellos en la exportación? Ellos son:2B 90 01 00

¿Cuál es el tipo de columna desde la que exportó?
Max Vernon

10

Tuve el mismo problema con los 4 bytes adicionales que se agregaron al comienzo de todos mis archivos también. En lugar de usar la opción -N en mi comando bcp, lo cambié a -C RAW. Cuando haga esto, se le preguntará a bcp las siguientes preguntas:

Ingrese el tipo de almacenamiento de archivos del campo FileData [imagen]:
Ingrese la longitud del prefijo del campo FileData [4]:
Ingrese la longitud del campo FileData [0]:
Ingrese el terminador de campo [ninguno]: 
¿Desea guardar esta información de formato en un archivo? [S / n]

Para solucionar esto, creé un archivo de texto (i.txt) en la raíz de mi servidor sql que tenía las siguientes líneas dentro para responder a cada una de estas:

yo
0 0
0 0

norte

Entonces, mi línea EXEC bcp se convirtió en:

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'

Esto exportó mi archivo sin ninguno de los caracteres adicionales.


2

Vine buscando una solución para exportar una Columna de IMAGEN que había almacenado diferentes tipos de archivos (pdf, xls, doc, xml ...) que quiero exportar.

El enfoque en la respuesta funcionó solo para archivos pdf. Para exportar todo tipo de archivos, tuve que ajustar la solución de la siguiente manera:

(1.) Cree un archivo de plantilla de formato:

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.) Abra el archivo de formato de exportación creado y edítelo de esa manera:

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

Luego ejecute su comando de exportación:

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.) En caso de que encuentre este error (como lo hice yo):

"Las columnas del archivo host [Microsoft] [SQL Native Client] pueden omitirse solo cuando se copian en el servidor"

asegúrese de lo siguiente:

  • ¡asegúrese de no olvidar editar la segunda fila e ingresar el número de entradas aquí (1 en este escenario)!
  • asegúrese de tener un CRLF al final de la última línea, ¡sin esto no funcionaría!

Después de esto, la exportación de cualquier palabra de archivo de Columna de IMAGEN sin error.

Homenajes para 1. y 2. todo va a la respuesta de la siguiente pregunta: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947


1

Si no tiene ningún problema con una solución GUI, hay un complemento realmente excelente para SSMS SSMSBoost que proporciona muchas funciones útiles y, por supuesto, la forma más sencilla de obtener una vista previa de las imágenes almacenadas en SQL (al menos en mi opinión)

NOTA : debe reiniciar SSMS después de instalar este complemento.

Instálelo y disfrute de la vista previa de imágenes solo con: RightClick> Visualizar como> Imagen


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

¡Mantenga el comando en UNA LÍNEA - UNA SOLA LÍNEA!

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

En algunos servidores xp_cmdshell está deshabilitado y obtienesSQL 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

Modifica tu publicación explicando qué se supone que debe hacer este código.
dezso

Gracias Erax por el guión, funcionó maravillosamente. PD: el script no puede extraer el archivo si se ejecutó de forma remota utilizando SSMS. Tuvo que ejecutarse directamente en el SQLServer para que pueda extraer el archivo adjunto.
Vaas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.