Come esportare una colonna di immagine in file in SQL Server?


13

Migrerò da un database. Esiste una colonna di tipo imageche vorrei esportare in file binari sul file system. Un file per ogni record. Come posso farlo con SQL Server?


1
Un buon post di Amna Asif sqlcache.blogspot.com/2014/09/…
aasim.abdullah

1
Probabilmente avrei rovinato un semplice flusso di dati SSIS con una trasformazione della colonna di esportazione
Martin Smith,

Risposte:


13

Questa è la soluzione che mi è venuta in mente:

  1. Abilita xp_cmdshellcon

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. Se necessario, creare una directory con xp_cmdshellper ottenere le autorizzazioni necessarie.

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. 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]


1
Ho provato il codice sopra e ha funzionato davvero ... fino a un certo punto. Per qualche motivo, l'immagine JPG ha 4 caratteri precedenti che la rendono non valida. Ho rimosso questi con un editor di testo e voilà ... JPG ha funzionato. Hai idea di cosa potrebbero essere questi 4 personaggi e come sbarazzarsene nell'esportazione? Sono:2B 90 01 00

Qual è il tipo di colonna da cui hai esportato?
Max Vernon,

10

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.


2

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:

  • assicurati di non aver dimenticato di modificare la seconda riga e inserisci il numero di voci qui (1 in questo scenario)!
  • assicurati di avere un CRLF alla fine dell'ultima riga, senza questo non ha funzionato!

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


1

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


0
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

Su alcuni server xp_cmdshell è disabilitato e ottieniSQL 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 il tuo post spiegando cosa dovrebbe fare questo codice.
dezso,

Grazie Erax per la sceneggiatura ha funzionato meravigliosamente. PS: lo script non riesce a estrarre il file se eseguito in remoto tramite SSMS. Doveva essere eseguito direttamente sul SQL Server per poter estrarre l'allegato.
Vaas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.