如何使用正确的文件扩展名将(全部)SQL server映像数据类型保存到文件系统

如何使用正确的文件扩展名将(全部)SQL server映像数据类型保存到文件系统,sql,sql-server,image,binary,file-extension,Sql,Sql Server,Image,Binary,File Extension,我在表中有不同类型的文件(txt、doc、jpg等),我想将它们全部保存到我的文件系统中。我知道如何一个文件一个文件地保存,但这没有用,我必须做一个循环,一次保存所有扩展名正确的文件。有什么建议吗 我现在这样做: DECLARE @ObjectToken INT EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT EXEC sp_OASetProperty @ObjectToken, 'Type', 1 EXEC sp_OAMethod @O

我在表中有不同类型的文件(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
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,
EXEC sp_OAMethod@ObjectToken,'SaveToFile',NULL,'d:/file.txt',2
EXEC sp_OAMethod@ObjectToken,“Close”
EXEC sp_OADestroy@ObjectToken
所以,我的问题是,是否有一种方法可以一次性为db表中的所有记录(保存所有文件)执行此操作,并为每个保存的文件设置正确的文件扩展名?

基于,并且假设您使用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
图像
应自动转换为
varbinary(max)


'\'
中断了语法高亮显示。)

我解决了这个问题。正如我发现的,将数据库从SQLServer2000迁移到2005真的很不容易。唯一有效的解决方案是:

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

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


祝你好运

你到底在问什么?我在问如何将sql server数据库中的二进制数据(图像数据类型)作为文件保存到文件系统中。你的代码看起来像是从任何原因复制的,你也不使用光标部分吗?我没有从那里复制它,所以我没有看到带有光标的部分。无论如何,正如我在上面看到的,它将所有文件保存为.jpg,并且我有一些不同的文件扩展名。你知道如何保存每个文件的扩展名吗?抱歉我的假设。如果未存储原始文件名和/或扩展名,则无法(轻松)检索它们。但是,您可以检查二进制文件的第一个字节:.jpg以ff d8 ff e0 xx xx xx“JFIF”开头,.png以xx“png”(xx=任意十六进制值)开头,等等。幸运的是,我使用SQL Server 2000,因此不能使用VARBINARY(MAX)、VARCHAR(MAX)。。。还有其他解决办法吗?无论如何,谢谢你的帮助!在SQL Server 2000中,您只能使用TEXTPTR和READTEXT。单个“Write”调用需要被通过二进制文件的循环分块替换。有关示例,请参见和,再问一个问题。将数据库迁移到SQLServer2005以便我可以使用VARBINARY(MAX)会更容易吗?那肯定会更容易