2

我有一个表,其中有一个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...

解决这个问题的最佳方法是什么?

4

2 回答 2

9

多亏了这篇文章,我已经弄清楚了...

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

关于该格式文件的最后说明.. 在最后一行之后必须有一个新行。否则你会得到一个错误。

享受!

于 2009-03-20T05:12:45.593 回答
0

最简单的(对我来说)是编写一个将 varbinary 字段转储到文件的小 .NET 应用程序。

如果您反对在 .NET 中工作,那么您应该(我没有对此进行测试)能够创建一个类型为“VARBINARY(MAX) FILESTREAM”的新列。确保您也有相应的“ROWGUIDCOL”列。然后你可以(理论上)做类似的事情:

更新表 SET varfilestream_col = varbinary_col

希望对你有用。

于 2009-03-05T00:46:49.150 回答