Como despejar todas as nossas imagens de um campo de VARBINARY (MAX) em SQL Server 2008 para o sistema de arquivos?

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

Pergunta

Eu tenho uma tabela que tem um campo IDENTITY e um campo VARBINARY(MAX) nele. Existe alguma maneira eu poderia despejar o conteúdo de cada campo VARBINARY(MAX) ao sistema de arquivos (eg. c:\temp\images)?

Esquema da tabela:

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...

O que é a melhor maneira de abordar isso?

Foi útil?

Solução

Eu percebi isso graças a este 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

Por favor, note -> u precisa ter um arquivo de formato, para o comando BCP. Este é o conteúdo do arquivo e eu tenho colocá-lo em c:. \ Temp (como observado na linha de comando BCP acima)

10.0
1
1       SQLIMAGE            0       0       ""   1     OriginalImage                      ""

Nota final sobre esse arquivo formato .. Tem que haver uma nova linha após a última linha. caso contrário, o retorno vai obter um erro.

Aproveite!

Outras dicas

O mais fácil (para mim) seria escrever um pequeno aplicativo .NET que jogou os campos varbinary para um arquivo.

Se você se opõem a trabalhar na NET, então você deve (eu não testei isso) ser capaz de criar uma nova coluna do tipo "VARBINARY (MAX) FILESTREAM". Certifique-se que você também tem uma coluna do correspondente "ROWGUIDCOL". Depois, você pode (em teoria) fazer algo como:

UPDATE tabela varfilestream_col SET = varbinary_col

Hope que funciona para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top