-2
我有一个名为ImageValues的表。其中,我有标有RecordID,ReportID和Image的列。图像以IMAGE数据类型存储。我想将图像提取到文件并将文件路径写入另一个标记为FilePath的列中。优选的是,文件名是 “的recordId-ReportID”二进制图像到文件
我使用SQL Server
可以这样做?
我有一个名为ImageValues的表。其中,我有标有RecordID,ReportID和Image的列。图像以IMAGE数据类型存储。我想将图像提取到文件并将文件路径写入另一个标记为FilePath的列中。优选的是,文件名是 “的recordId-ReportID”二进制图像到文件
我使用SQL Server
可以这样做?
其中一种方法是使用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的方法,请阅读here和also here。之后,您可以使用Windows资源管理器简单地将文件复制到任意位置。
短而无用的答案是“是的,它可以完成”。 *究竟*取决于您使用的SQL的方言(Oracle,SQL Server,MySQL等),是否要将文件保存在数据库服务器或其他计算机上,以及是否希望从SQL执行此操作或另一种编程语言。如果您在问题中添加了更多细节,则可能有人会提供帮助。 – Mihai
抱歉,延迟响应。图像实际上存储为图像数据类型。我正在使用SQL Server,并且图像可以保存到服务器(分区E)。 – Michael