要存档的二进制图像

时间:2015-07-19 17:05:57

标签: sql sql-server image

我有一个名为ImageValues的表。在其中,我有标记为RecordID,ReportID和Image的列。图像存储为IMAGE数据类型。我想将图像提取到文件,并将文件路径写入标记为FilePath的另一列。优选地,文件名将是“RecordID-ReportID”

我正在使用SQL Server

可以这样做吗?

1 个答案:

答案 0 :(得分:0)

其中一种方法是使用OLE自动化,如果您拥有该计算机的管理员权限,则可以启用该自动化。以下是一些示例代码,大量借鉴this SO answer

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

DECLARE @file int,
        @FilePath varchar(80),
        @hr INT,
        @RecordID INT,
        @ReportID INT,
        @Image VARBINARY(MAX);
DECLARE imgs CURSOR 
    FOR SELECT RecordID, ReportID, "Image" FROM dbo.ImageValues
    FOR UPDATE OF FilePath;

OPEN imgs;  
FETCH NEXT FROM imgs INTO @RecordID, @ReportID, @Image;
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @FilePath = 'E:/' + CAST(@RecordID AS VARCHAR(10)) + '-' + CAST(@ReportID AS VARCHAR(10)) + '.jpg';

    EXEC sp_OACreate 'ADODB.Stream', @file OUT;
    EXEC sp_OASetProperty @file, 'Type', 1;
    EXEC sp_OAMethod @file, 'Open';
    EXEC sp_OAMethod @file, 'Write', NULL, @Image;
    EXEC sp_OAMethod @file, 'SaveToFile', NULL, @FilePath, 2;
    EXEC sp_OAMethod @file, 'Close';
    EXEC sp_OADestroy @file;

    UPDATE dbo.ImageValues SET FilePath = @FilePath WHERE CURRENT OF imgs;

    FETCH NEXT FROM imgs INTO @RecordID, @ReportID, @Image;
END
CLOSE imgs;
DEALLOCATE imgs;
GO

sp_configure 'Ole Automation Procedures', 0;
GO
RECONFIGURE;
GO

请注意,所有文件都将以扩展名“.jpg”存储,但您可以将其扩展为根据the magic number.检测图像类型

如果您使用的是SQL Server 2012或更高版本,则还可以使用名为FileTables的酷炫功能。阅读herealso here,了解使用T-SQL将数据插入FileTable的方法。之后,您只需使用Windows资源管理器将文件复制到任何位置即可。