Come scaricare tutte le nostre immagini da un campo VARBINARY (MAX) in SQL Server 2008 al filesystem?

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

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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top