如何使用SQL将映像从SQL Server保存到文件

时间:2009-11-04 13:40:19

标签: sql sql-server email image

问题

在SQL Server 2005中,我有一个包含图像的表(数据类型:图像)。仅使用SQL,如何将图像另存为文件(在运行SQL Server的同一服务器上)。如果必须,我将使用SQL CLR,但如果可能的话,我想避免这种情况。

背景

我希望SQL Server作业不运行调用proc的调度,该调度将使用SQL Server数据库邮件发送带有嵌入式图像的电子邮件,如下所示:

exec msdb.dbo.sp_send_dbmail
@profile_name = 'MyProfile',
@recipients = 'bob@hotmail.com',
@subject = 'hello',
@file_attachments = 'C:\MyLogo.gif',
@body=N'<p>Image Test</p><img src="MyLogo.gif" /><p>See image there?</p>', 
@body_format = 'HTML';

该SQL有效,但我需要先将图像保存为文件。如果我可以直接在电子邮件中获取图像而不将其保存为文件,那很好,但它需要嵌入到电子邮件中,我只想使用SQL。

4 个答案:

答案 0 :(得分:5)

我尝试过使用@attach_query_result_as_file选项但是没有办法将该查询写成二进制文件,我可以开始工作。因此,下一个选项是将bcp用于临时文件,然后附加文件。

DECLARE @sql VARCHAR(1000)

SET @sql = 'BCP "SELECT ImageColumn FROM YourTable where id = 1 " QUERYOUT C:\TEMP\MyLogo.gif -T -fC:\TEMP\bcpFormat.fmt -S ' + @@SERVERNAME
EXEC master.dbo.xp_CmdShell @sql

exec msdb.dbo.sp_send_dbmail
@profile_name = 'MyProfile',
@recipients = 'bob@hotmail.com',
@subject = 'test as image',
@body=N'<p>Image Test</p><img src="MyLogo.gif" /><p>See image there?</p>', 
@file_attachments = 'C:\TEMP\MyLogo.gif',
@body_format = 'HTML';

bcpFormat.fmt看起来像这样:

8.0
1
1 SQLIMAGE 0 0 "" 1 Image ""

这会将数据库中的图像作为文件附加到电子邮件中。它仍然不会显示它“内联”,因为需要更多的工作来将图像编码到电子邮件的正文中并从您的html引用它。您还需要为文件生成一些唯一的名称并进行清理,以便多个进程不会相互衔接。

答案 1 :(得分:1)

This article解释了如何使用SQL Server OLE自动化存储过程(允许您通过T-SQL创建和使用基于COM的对象)来创建文件。

答案 2 :(得分:0)

SQL CLR(.NET)存储过程是否可能?将数据从blob字段保存到磁盘上的临时文件没有问题。

答案 3 :(得分:-1)

我认为madC的评论是最好的解决方案。 您也可以尝试使用以下内容:

INSERT INTO OPENROWSET('BULK','',BULK_BLOB)......

但在我这边需要以下额外步骤:

sp_configure 'show advanced options', 1
reconfigure with override
sp_configure 'Ad Hoc Distributed Queries', 1 
reconfigure with override

在此之后,INSERT的结果是:

Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "BULK" for linked server "(null)".

也许您将能够找到如何使其发挥作用的想法。