2009-09-02 12 views
10

Sto utilizzando Microsoft SQL Server Management Studio per connettersi a un database. In esso ho una tabella, una colonna di cui è una colonna Immagine contenente i dati del file. Un'altra colonna è una stringa contenente il nome del file.Come esportare il campo immagine in un file?

C'è un modo per scrivere uno script sql che mi consenta di selezionare un record e scrivere questi dati in un file? O se questo non è possibile, qual è un modo semplice per raggiungere questo?

Ho visto questa domanda relativa, ma non sembra proprio la stessa cosa: Save image column to file in sql-server 2000

risposta

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

Messaggio 8152, livello 16, stato 10, riga 7 La stringa oi dati binari verrebbero troncati. –

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 - Il link per l'articolo 'Leggere e scrivere file in SQL Server utilizzando T-SQL' stato utile ma dopo aver ottenuto il pezzo di codice funzionante ha prodotto un file immagine non valido.

+0

@mathijusuitmegan Sono di fronte questo problema: Messaggio 8152, livello 16, stato 10, linea 7 Stringa o i dati binari verrebbero troncati. –

5

Da mkader a codeproject:

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

Poi il dump di un file di 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 

mio file di formato si presentava così:

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

Ho poi modificato il file di formato in questo modo:

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

E poi corse questo SQL in SQL Server Management Studio:

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 

Questo ha funzionato molto bene, qualsiasi tipo di dati nella colonna immagine funziona.

+0

Grazie! Il file di formato era ciò di cui avevo bisogno per farlo funzionare. –

0

So che questo è sopra il thread di 2 anni, ancora voluto pubblicare, perché potrebbe aiutare qualcuno. Se vogliamo esportare immagini insieme alle altre colonne (che include i simboli) da una tabella di database a un file, in modo che possano essere importate in un altro SQL Server, ciò risulta molto utile.

Il codice seguente esporterà la tabella del database specificata al percorso del file scelto.

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 

Lo switch -w è per un file di dati in formato Unicode e il delimitatore sarà la scheda predefinita delimitatore se non specifichiamo un delimitatore. In questo caso, il file di dati viene salvato con un'estensione dat. Forse potrebbe essere salvato anche in altri formati, ma non l'ho testato, mentre questo funziona perfettamente.

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

Poi per l'importazione:

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

Questo importa il file di dati in modo molto efficiente nella tabella di database specificato.

-2

soluzione Adattato da mathijsuitmegen e questo ha funzionato perfettamente per me:

Code1

Code2

+0

Suggerisco di copiare il testo anziché l'immagine. Altrimenti non è davvero piacevole da leggere. – Carol

Problemi correlati