2009-09-02 24 views
10

Estoy usando Microsoft SQL Server Management Studio para conectarme a una base de datos. En él tengo una tabla, una columna de la cual es una columna de imagen que contiene datos de archivo. Otra columna es una cadena que contiene el nombre del archivo.¿Cómo exportar el campo de imagen al archivo?

¿Existe alguna manera de que pueda escribir algún script SQL que me permita seleccionar un registro y escribir estos datos en un archivo? O si esto no es posible, ¿cuál es una manera simple de lograr esto?

que he visto esta pregunta relacionada, pero no parece exactamente lo mismo: Save image column to file in sql-server 2000

Respuesta

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, nivel 16, estado 10, línea 7 La cadena o los datos binarios se truncarán. –

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 - El enlace al artículo 'La lectura y escritura de archivos en SQL Server a través de T-SQL' era útil, pero después de obtener el código de trabajo, produjo un archivo de imagen no válido.

+0

@mathijusuitmegan estoy frente a este problema: Msg 8152, nivel 16, estado 10, línea 7 cadena o los datos binarios se truncarán. –

5

De mkader en codeproject:

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

después descargar un archivo de formato:

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 

Mi archivo de formato se veía así:

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

luego edité el archivo de formato como tal:

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

y luego corrió este SQL en 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 

Esto funcionó muy bien, cualquier tipo de datos en la columna de la imagen funciona.

+0

Gracias! El archivo de formato era lo que necesitaba para que esto funcionara. –

0

Sé que esto es anterior a 2 años de hilo, aún quería publicar, porque podría ayudar a alguien. Si queremos exportar imágenes junto con otras columnas (que incluyen símbolos) de una tabla de base de datos a un archivo, para que puedan importarse a otro servidor SQL, esto es muy útil.

El siguiente código exportará la tabla de la base de datos especificada a la ruta de archivo de su elección.

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 

La opción -w es para un archivo de datos en formato Unicode y el delimitador será la pestaña predeterminada delimitador si no se especifica un delimitador. En este caso, el archivo de datos se guarda con una extensión dat. Quizás también podría guardarse en otros formatos, pero no lo he probado, mientras que este funciona perfectamente.

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

A continuación, para la importación:

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

Esto importa el archivo de datos de manera muy eficiente en la tabla de base de datos especificada.

-2

solución Adaptado por mathijsuitmegen y esto funcionó perfectamente para mí:

Code1

Code2

+0

Le sugiero que copie el texto en lugar de la imagen. De lo contrario, no es realmente agradable de leer. – Carol

Cuestiones relacionadas