2015-07-19 91 views
-2

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

我使用SQL Server

可以这样做?

+0

短而无用的答案是“是的,它可以完成”。 *究竟*取决于您使用的SQL的方言(Oracle,SQL Server,MySQL等),是否要将文件保存在数据库服务器或其他计算机上,以及是否希望从SQL执行此操作或另一种编程语言。如果您在问题中添加了更多细节,则可能有人会提供帮助。 – Mihai

+0

抱歉,延迟响应。图像实际上存储为图像数据类型。我正在使用SQL Server,并且图像可以保存到服务器(分区E)。 – Michael

回答

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的很酷功能。有关使用T-SQL将数据插入FileTable的方法,请阅读herealso here。之后,您可以使用Windows资源管理器简单地将文件复制到任意位置。