Migrerò da un database. Esiste una colonna di tipo image
che vorrei esportare in file binari sul file system. Un file per ogni record. Come posso farlo con SQL Server?
Migrerò da un database. Esiste una colonna di tipo image
che vorrei esportare in file binari sul file system. Un file per ogni record. Come posso farlo con SQL Server?
Risposte:
Questa è la soluzione che mi è venuta in mente:
Abilita xp_cmdshell
con
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Se necessario, creare una directory con xp_cmdshell
per ottenere le autorizzazioni necessarie.
EXEC master..xp_cmdshell 'mkdir C:\exportdir'
Usa 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 deve essere il nome completo della tabella, ovvero [Yourdb]. [YourSchema]. [YourTable]
2B 90 01 00
Ho avuto lo stesso problema con l'aggiunta di 4 byte aggiuntivi all'inizio di tutti i miei file. Invece di usare l'opzione -N nel mio comando bcp, l'ho cambiato in -C RAW. Quando lo fai, bcp ti verrà chiesto con le seguenti domande:
Immettere il tipo di archiviazione file del campo FileData [immagine]: Immettere il prefisso lunghezza del campo FileData [4]: Immettere la lunghezza del campo FileData [0]: Immettere il terminatore di campo [nessuno]: Vuoi salvare le informazioni di questo formato in un file? [Y / n]
Per risolvere questo problema ho creato un file di testo (i.txt) sulla radice del mio server sql che conteneva le seguenti righe per rispondere a ciascuna di queste:
io 0 0 n
Quindi, la mia linea bcp EXEC è diventata:
EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db DOVE id = 1" queryout "C: \ exportdir \ yourfile.pdf" -T -C RAW <C: \ i.txt'
Questo ha esportato il mio file senza alcun carattere aggiuntivo.
Sono venuto alla ricerca di una soluzione per esportare una colonna IMMAGINE che avesse archiviato diversi tipi di tipi di file (pdf, xls, doc, xml ...) che desidero esportare.
L'approccio nella risposta ha funzionato solo per i file pdf. Per esportare tutti i tipi di file ho dovuto adattare la soluzione come segue:
(1.) Creare un file modello di 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.) Apri il file di formato di esportazione creato e modificalo in questo modo:
10.0
1
1 SQLIMAGE 0 0 "" 1 img_col ""
Quindi eseguire il comando di esportazione:
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.) Nel caso in cui si verifichi questo errore (come ho fatto io):
"[Microsoft] [SQL Native Client] Le colonne del file host possono essere ignorate solo durante la copia nel server"
assicurarsi che quanto segue:
Successivamente, l'esportazione di qualsiasi parola del file della colonna IMMAGINE senza errori.
Gli omaggi per 1. e 2. vanno tutti alla risposta alla seguente domanda: /programming/1366544/how-to-export-image-field-to-file/24006947#24006947
Se non hai alcun problema con una soluzione GUI, c'è un ottimo componente aggiuntivo per SSMS SSMSBoost che fornisce molte funzionalità utili e, naturalmente, il modo più semplice per visualizzare in anteprima le immagini archiviate in SQL (almeno secondo me)
NOTA : è necessario riavviare SSMS dopo aver installato questo componente aggiuntivo.
Installalo e goditi l'anteprima delle immagini solo con: RightClick> Visualizza come> Immagine
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'
Mantieni il comando su UNA LINEA - SINGOLA LINEA !!!
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
SQL 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.
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