使用sp_send_dbmail发送无文件存储的PDF附件,如何去除查询附加内容?
解决方案
问题根源
你当前使用@query参数传递二进制内容的方式不可行,因为SQL Server会将二进制列转换为十六进制字符串输出,同时会附加(1 rows affected)这类执行消息,最终生成的附件是文本格式而非真正的二进制PDF文件,导致无法正常打开。
正确实现方式:直接添加二进制附件(无需文件系统)
可以通过sysmail_add_attachment_sp存储过程,将数据库中的二进制PDF内容直接作为附件添加到邮件中,无需将文件写入文件系统。具体步骤如下:
- 先获取PDF的二进制内容到变量
- 调用
sp_send_dbmail时通过@mailitem_id输出参数获取邮件ID - 使用
sysmail_add_attachment_sp将二进制内容附加到该邮件
完整代码示例
DECLARE @mail_id UNIQUEIDENTIFIER; DECLARE @pdf_content VARBINARY(MAX); -- 从数据库中读取PDF的二进制内容 SELECT @pdf_content = fileContent FROM documents WHERE id = 882307; -- 发送邮件并获取邮件ID EXEC msdb.dbo.sp_send_dbmail @profile_name = 'notifications_ACME', @recipients = 'marc.guillot@acme.com', @subject = 'Test PDF Attachment', @from_address = 'notifications@acme.com', @body = 'Test sending a PDF attachment', @mailitem_id = @mail_id OUTPUT; -- 将二进制内容作为PDF附件添加到邮件 EXEC msdb.dbo.sysmail_add_attachment_sp @mailitem_id = @mail_id, @file_name = 'Test.pdf', @file_type = 'application/pdf', -- 指定MIME类型,确保邮件客户端识别为PDF @file_content = @pdf_content;
为什么原方法无法解决
@query参数的设计是返回查询的文本结果集,无法直接输出原始二进制数据,即使去掉表头和空格,得到的也是十六进制字符串而非二进制文件。(1 rows affected)是SQL Server的执行消息,不属于查询结果集,无法通过sp_send_dbmail的参数去除,且即便去除,附件格式仍不符合PDF要求。
内容的提问来源于stack exchange,提问作者Marc Guillot
相关产品推荐
相关产品推荐

