Как выгрузить все наши изображения из поля VARBINARY (MAX) в SQL Server 2008 в файловую систему? - PullRequest
2 голосов
/ 05 марта 2009

У меня есть таблица с полем IDENTITY и полем VARBINARY(MAX). Можно ли каким-либо образом вывести содержимое каждого поля VARBINARY(MAX) в файловую систему (например, c:\temp\images)?

Схема таблицы:

PhotoId INTEGER NOT NULL IDENTITY
Image VARBINARY(MAX) NOT NULL
DateCreated SMALLDATETIME

Выход:

c:\temp\images\1.png
c:\temp\images\2.png
c:\temp\images\3.png
... etc...

Как лучше всего подойти к этому?

Ответы [ 2 ]

9 голосов
/ 20 марта 2009

Я понял это благодаря этому посту ...

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

Обратите внимание -> вам нужен файл формата для команды BCP. Это содержимое файла, и я поместил его в c: \ Temp (как указано в командной строке BCP выше).

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

Последнее замечание об этом файле формата ... там должна быть новая строка после последней строки. в противном случае вы получите ошибку.

Наслаждайтесь!

0 голосов
/ 05 марта 2009

Самым простым (для меня) было бы написать маленькое приложение .NET, которое выгружало бы поля varbinary в файл.

Если вы против работы в .NET, вы должны (я не проверял это) иметь возможность создать новый столбец типа "VARBINARY (MAX) FILESTREAM". Убедитесь, что у вас также есть соответствующий столбец «ROWGUIDCOL». Тогда вы можете (теоретически) сделать что-то вроде:

ОБНОВЛЕНИЕ таблицы SET varfilestream_col = varbinary_col

Надеюсь, что это работает для вас.

...