在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。
答案 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)".
也许您将能够找到如何使其发挥作用的想法。