¿Cómo volcar todas nuestras imágenes de un campo VARBINARY (MAX) en SQL Server 2008 al sistema de archivos?

StackOverflow https://stackoverflow.com/questions/613154

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top