【问题标题】:How to save (all) SQL server image datatype to file system with correct file extension如何使用正确的文件扩展名将(全部)SQL Server 图像数据类型保存到文件系统
【发布时间】:2013-03-07 22:00:25
【问题描述】:

我在表格中有不同类型的文件(txt、doc、jpg 等),我想将它们全部保存到我的文件系统中。我知道如何逐个文件执行此操作,但这没用,我必须执行一个循环,一次保存所有具有正确扩展名的文件。有什么建议吗?

我现在就是这样做的:

DECLARE @ObjectToken INT
EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod @ObjectToken, 'Open'
EXEC sp_OAMethod @ObjectToken, 'Write', NULL, <this is where binary data goes>
EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, 'd:/file.txt', 2
EXEC sp_OAMethod @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken

所以,我的问题是,有没有一种方法可以一次对 db 表中的所有记录(保存所有文件)执行此操作,并为每个保存的文件设置正确的文件扩展名?

【问题讨论】:

  • 你到底在问什么?
  • 我在问如何将二进制数据(图像数据类型)从 sql server 数据库保存到文件系统作为文件。
  • 您的代码看起来像是从heidibrebels.be/blog/archives/2011/… 复制而来的,有什么理由您也不使用光标部分吗?
  • 我没有从那里复制它,所以我没有看到带有光标的部分。无论如何,正如我在heidibrebels.be/blog/archives/2011/… 上看到的,它将所有文件保存为.jpg,并且我有几个不同的文件扩展名。您是否知道如何使用自己的扩展名保存每个文件?
  • 为我的假设道歉。如果您没有存储原始文件名和/或扩展名,则没有(简单的)方法可以检索它们。但是,您可以检查二进制文件的第一个字节:.jpg 以 ff d8 ff e0 xx xx "JFIF" 开头,.png 以 xx "PNG" 开头(xx = 任意十六进制值)等

标签: sql sql-server image binary file-extension


【解决方案1】:

基于code I mentioned in the comments,并且假设您使用 SQL Server 2005 或更高版本,此解决方案应该适合您

DECLARE 
    @FileContent VARBINARY(MAX),
    @FileName VARCHAR(MAX),
    @ObjectToken INT,
    @FileID BIGINT

DECLARE cFiles CURSOR FAST_FORWARD FOR
SELECT Id, FileName, Image_Data from MyFileTable
OPEN cFiles

FETCH NEXT FROM cFiles INTO @FileID, @FileName, @FileContent

WHILE @@FETCH_STATUS = 0 BEGIN

    -- CHOOSE 1 of these SET statements:

    -- if FileName is unique, then just remove special characters
    SET @FileName = REPLACE(REPLACE(@FileName, '\', ' '), ':', ' ')
    -- if FileName without path information is unique
    SET @FileName = SUBSTRING(@FileName,
        len(@FileName)+2-CHARINDEX('\',REVERSE(@FileName)),len(@FileName))
    -- if you just take ID + extensions
    SET @FileName = 'c:\path\to\' + CAST(@FileID AS varchar) + 
        SUBSTRING(@ap_description,len(@ap_description)+1
            -CHARINDEX('.',REVERSE(@ap_description)),len(@ap_description))

    EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
    EXEC sp_OASetProperty @ObjectToken, 'Type', 1
    EXEC sp_OAMethod @ObjectToken, 'Open'
    EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @FileContent
    EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FileName, 2
    EXEC sp_OAMethod @ObjectToken, 'Close'
    EXEC sp_OADestroy @ObjectToken

    FETCH NEXT FROM cFiles INTO @FileID, @FileName, @FileContent
END

CLOSE cFiles
DEALLOCATE cFiles

image 应自动转换为 varbinary(max)

'\' 打破 SO 语法高亮显示。)

【讨论】:

  • 不幸的是我使用 SQL Server 2000,所以我不能使用 VARBINARY (MAX), VARCHAR(MAX)... 还有其他解决方案吗?无论如何感谢您的帮助!
  • 在 SQL Server 2000 中,您只能使用 TEXTPTR 和 READTEXT。单个“写入”调用需要通过二进制文件的循环分块替换。有关示例,请参阅 books.google.at/…guidanceshare.com/wiki/…
  • 再问一个问题。将 db 迁移到 SQL Server 2005 以便我可以使用 VARBINARY(MAX) 会更容易吗?
  • 这样肯定更容易
【解决方案2】:

我解决了这个问题。我发现将数据库从 SQL Server 2000 迁移到 2005 真的不容易。唯一可行的解​​决方案是这个 - http://tek-works.com/fixing-there-is-already-an-object-named-sysnsobjs-in-the-database/

完成这些步骤后,您只需将兼容级别设置为 90。(右键单击数据库 > 属性 > 兼容级别)

然后您可以使用 VARBINARY(MAX) 并将完整的图像数据类型二进制文件保存到文件系统。

祝你迁移顺利!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多