You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sp_send_dbmail发送无文件存储的PDF附件,如何去除查询附加内容?

解决方案

问题根源

你当前使用@query参数传递二进制内容的方式不可行,因为SQL Server会将二进制列转换为十六进制字符串输出,同时会附加(1 rows affected)这类执行消息,最终生成的附件是文本格式而非真正的二进制PDF文件,导致无法正常打开。

正确实现方式:直接添加二进制附件(无需文件系统)

可以通过sysmail_add_attachment_sp存储过程,将数据库中的二进制PDF内容直接作为附件添加到邮件中,无需将文件写入文件系统。具体步骤如下:

  1. 先获取PDF的二进制内容到变量
  2. 调用sp_send_dbmail时通过@mailitem_id输出参数获取邮件ID
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:47:40