Come scaricare tutte le nostre immagini da un campo VARBINARY (MAX) in SQL Server 2008 al filesystem?
-
03-07-2019 - |
Domanda
Ho una tabella che contiene un campo IDENTITY
e un campo VARBINARY (MAX)
. Esiste un modo per scaricare il contenuto di ciascun campo VARBINARY (MAX)
nel filesystem (es. c: \ temp \ images
) ?
Schema tabella:
PhotoId INTEGER NOT NULL IDENTITY
Image VARBINARY(MAX) NOT NULL
DateCreated SMALLDATETIME
Output:
c:\temp\images\1.png
c:\temp\images\2.png
c:\temp\images\3.png
... etc...
Qual è il modo migliore per affrontarlo?
Soluzione
L'ho capito grazie a questo post ...
SET NOCOUNT ON
DECLARE @IdThumbnail INTEGER,
@MimeType VARCHAR(100),
@FileName VARCHAR(200),
@Sqlstmt varchar(4000)
DECLARE Cursor_Image CURSOR FOR
SELECT a.IdThumbnail
FROM tblThumbnail a
ORDER BY a.IdThumbnail
OPEN Cursor_Image
FETCH NEXT FROM Cursor_Image INTO @IdThumbnail
WHILE @@FETCH_STATUS = 0
BEGIN
-- Generate the file name based upon the ID and the MIMETYPE.
SELECT @FileName = LTRIM(STR(@IdThumbnail)) + '.png'
-- Framing DynamicSQL for XP_CMDshell
SET @Sqlstmt='BCP "SELECT OriginalImage
FROM Appian.dbo.tblThumbnail
WHERE IdThumbnail = ' + LTRIM(STR(@IdThumbnail)) +
'" QUERYOUT c:\Temp\Images\' + LTRIM(@FileName) +
' -T -fC:\Temp\ImageFormatFile.txt'
print @FileName
print @sqlstmt
EXEC xp_cmdshell @sqlstmt
FETCH NEXT FROM Cursor_Image INTO @IdThumbnail
END
CLOSE Cursor_Image
DEALLOCATE Cursor_Image
Nota: > devi avere un file di formato, per il comando BCP. Questo è il contenuto del file e l'ho inserito in c: \ Temp (come indicato nella riga di comando BCP sopra).
10.0
1
1 SQLIMAGE 0 0 "" 1 OriginalImage ""
Nota finale su quel file di formato .. DEVE ESSERE UNA NUOVA LINEA DOPO L'ULTIMA LINEA. altrimenti visualizzerai un errore.
Enjoy!
Altri suggerimenti
Il più semplice (per me) sarebbe scrivere una piccola applicazione .NET che ha scaricato i campi varbinary in un file.
Se sei contrario a lavorare in .NET, dovresti (non l'ho provato) per poter creare una nuova colonna di tipo " VARBINARY (MAX) FILESTREAM " ;. Assicurati di avere anche il corrispondente "ROWGUIDCOL" colonna. Quindi puoi (in teoria) fare qualcosa del tipo:
Tabella UPDATE SET varfilestream_col = varbinary_col
Spero che funzioni per te