¿Cómo volcar todas nuestras imágenes de un campo VARBINARY (MAX) en SQL Server 2008 al sistema de archivos?
-
03-07-2019 - |
Pregunta
Tengo una tabla que tiene un campo IDENTITY
y un campo VARBINARY (MAX)
. ¿Hay alguna forma de que pueda volcar el contenido de cada campo VARBINARY (MAX)
en el sistema de archivos (por ejemplo, c: \ temp \ images
) ?
Esquema de tabla:
PhotoId INTEGER NOT NULL IDENTITY
Image VARBINARY(MAX) NOT NULL
DateCreated SMALLDATETIME
Salida:
c:\temp\images\1.png
c:\temp\images\2.png
c:\temp\images\3.png
... etc...
¿Cuál es la mejor manera de abordar esto?
Solución
Lo he descubierto gracias a esta publicación ...
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
Tenga en cuenta - > necesita tener un archivo de formato para el comando BCP. Este es el contenido del archivo y lo he colocado en c: \ Temp (como se indica en la línea de comandos BCP anterior).
10.0
1
1 SQLIMAGE 0 0 "" 1 OriginalImage ""
Nota final sobre ese archivo de formato ... TIENE QUE SER UNA NUEVA LÍNEA DESPUÉS DE LA ÚLTIMA LÍNEA. de lo contrario, obtendrá un error.
¡Disfruta!
Otros consejos
Lo más fácil (para mí) sería escribir una pequeña aplicación .NET que volcara los campos varbinarios a un archivo.
Si se opone a trabajar en .NET, entonces debería (no lo he probado) poder crear una nueva columna de tipo " VARBINARY (MAX) FILESTREAM " ;. Asegúrese de tener también el correspondiente "ROWGUIDCOL" columna. Entonces puedes (en teoría) hacer algo como:
tabla UPDATE SET varfilestream_col = varbinary_col
Espero que funcione para ti.