SQL Server使用sp_send_dbmail发送查询附件时sqlcmd库初始化报错
问题解决方法
根因说明
这个报错本质是sp_send_dbmail调用sqlcmd执行你传入的查询语句时,查询本身执行失败触发的通用错误,和你的CASE语句的写法、查询执行上下文两个问题直接相关。
具体修复步骤
- 1 修正CASE语句写法
补充CASE的ELSE兜底分支,避免匹配不到值时返回NULL带来的解析异常;同时将列别名的单引号替换为方括号,单引号作为别名在sqlcmd解析模式下兼容性极差,极易触发异常。 - 2 明确指定查询执行的数据库上下文
sp_send_dbmail默认在msdb系统库下执行传入的查询语句,如果你的man表存放在业务库中,未指定数据库会触发找不到表的错误,可以通过两种方式解决:- 给
sp_send_dbmail补充@execute_query_database参数,指定你的业务库名称 - 直接在查询的表名前写全数据库、schema前缀,例如
[你的业务库名].[dbo].[man]
- 给
- 3 补充CSV相关的输出参数(可选)
你指定的附件是csv格式,补充@query_result_separator = ','参数指定列分隔符为逗号,避免输出的附件内容格式错乱;同时注意你原代码中附件扩展名写为cvs属于拼写错误,建议修正为csv。
修复后完整代码示例
declare @q nvarchar(max) declare @sub nvarchar(200) -- 补充变量声明,避免未定义变量报错 select @q = 'select case when s.mantype = ''99'' then ''Pre-sales'' when s.mantype = ''44'' then ''idk'' when s.mantype = ''77'' then ''Van sales'' when s.mantype = ''33'' then ''Delivery Person'' when s.mantype = ''55'' then ''Manager'' else '''' -- 新增兜底分支,匹配不到值时返回空字符串 end [mantype] -- 别名改用方括号 from [你的业务库名].[dbo].[man] s ' -- 写全表名路径 begin select @sub = 'Fire a Test ' + cast(convert(date,getdate()) as nvarchar) EXEC msdb.dbo.sp_send_dbmail @recipients = 'my@email.com', @profile_name = 'Profileone', @subject = @sub, @body ='TEST' , @body_format = 'TEXT', @query_result_header = 1 , @query = @q, @attach_query_result_as_file = 1, @query_attachment_filename= 'Report.csv', -- 修正扩展名拼写 @query_result_separator = ',', -- 新增csv分隔符 @execute_query_database = N'你的业务库名' -- 新增指定执行库,和上面表全路径二选一即可 end
内容的提问来源于stack exchange,提问作者MickeyMan
相关产品推荐
相关产品推荐

