我有一个名为ImageValues的表。在其中,我有标记为RecordID,ReportID和Image的列。图像存储为IMAGE数据类型。我想将图像提取到文件,并将文件路径写入标记为FilePath的另一列。优选地,文件名将是“RecordID-ReportID”
我正在使用SQL Server
可以这样做吗?
答案 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的酷炫功能。阅读here和also here,了解使用T-SQL将数据插入FileTable的方法。之后,您只需使用Windows资源管理器将文件复制到任何位置即可。