Come esportare il campo immagine in un file?

Sto usando 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.

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 è ansible, qual è un modo semplice per raggiungere questo?

Ho visto questa domanda correlata, ma non sembra affatto la stessa: Salva la colonna dell’immagine su file in sql-server 2000

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

Da mkader al codeproject :

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

Quindi scaricare 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 

Il mio file di formato assomigliava a questo:

 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 quindi modificato il file di formato in questo modo:

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

E poi ha eseguito questo SQL in 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 

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

 -- 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 collegamento all’articolo “Lettura e scrittura di file in SQL Server tramite T-SQL” è stato utile, ma dopo aver ottenuto il codice funzionante ha prodotto un file di immagine non valido.

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 

L’opzione -w è per un file di dati in formato Unicode e il delimitatore sarà il delimitatore di tabulazione predefinito se non si specifica 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

Quindi 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 specificata.