SQL Server 2016发送带附件邮件突然失效求助
问题排查与解决方案
针对SQL Server 2016环境下sp_send_dbmail无法生成附件的问题,按以下步骤排查修复:
1. 修正@blind_copy_recipients参数格式
你的代码中该参数写法存在错误:
@blind_copy_recipients='N''xyz@xyz.com'
正确格式应为:
@blind_copy_recipients=N'xyz@xyz.com'
多余的单引号和错误的引号嵌套会导致参数解析异常,可能中断附件生成流程。
2. 移除查询中的GO语句
sp_send_dbmail的@Query参数不支持GO批处理分隔符(这是SSMS工具命令,不属于T-SQL语法),修改查询语句为:
SET @SQL =' USE MYDB SET NOCOUNT ON SELECT x, Code , y , z FROM table1 LEFT JOIN table2 ON table1.a= table2.b'
保留GO会导致查询执行失败,无法生成附件内容。
3. 修正文件名中的非法字符
convert(date,getdate(),103)生成的dd/mm/yyyy格式包含斜杠/,属于文件名非法字符,会导致附件无法创建。改用无分隔符的日期格式:
SET @File = 'xyz' + CONVERT(nvarchar(50), GETDATE(), 112) + '.txt'
格式112对应yyyyMMdd,生成合法文件名(如xyz20240520.txt)。
4. 查看Database Mail后台日志
执行以下查询获取邮件发送的详细日志,排查隐藏错误:
SELECT * FROM msdb.dbo.sysmail_allitems ORDER BY send_request_date DESC; SELECT * FROM msdb.dbo.sysmail_log ORDER BY log_date DESC;
重点关注sysmail_log中的错误信息,比如文件权限、查询执行失败等。
5. 验证权限与临时目录
- 确认Database Mail使用的账户(通常为SQL Server代理账户)对MYDB拥有
SELECT权限,可正常执行目标查询。 - 检查该账户是否有权限访问SQL Server临时文件目录(默认路径为
C:\Program Files\Microsoft SQL Server\<InstanceID>\MSSQL\Log),附件生成需在此目录创建临时文件。
内容的提问来源于stack exchange,提问作者Khalil Ismail
相关产品推荐
相关产品推荐

