使用sp_send_dbmail发附件报sqlcmd库初始化错误-2147467259怎么解决
错误原因及解决方案
未指定查询执行的数据库上下文
sp_send_dbmail默认在msdb数据库下执行@query参数传入的语句,若你的employees表存储在业务库而非msdb库,就会因为找不到对象触发报错。
解决方法二选一:- 在查询语句中显式指定数据库和schema:
DECLARE @query nvarchar(max) = 'select top (1) * from 你的业务库名.dbo.employees';- 调用存储过程时添加
@execute_query_database参数指定执行库:
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Email', @recipients = 'me@gmail.com', @query = @query, @execute_query_database = '你的业务库名', -- 新增这行 @query_attachment_filename = 'employees.csv', @body_format = 'HTML', @subject = 'Test';权限配置不足
执行sp_send_dbmail的用户、Database Mail服务运行账号,都需要拥有目标业务库的访问权限,以及employees表的SELECT权限,请确认对应账号的权限映射是否正确。查询语句本身存在错误
先单独执行你定义的@query语句,检查表名拼写、字段是否存在、是否有权限访问,查询本身执行报错也会触发该初始化错误。SQLCMD组件缺失
sp_send_dbmail的@query参数依赖SQLCMD工具运行,若服务器未安装对应版本的SQLCMD组件,就会初始化失败。你可以直接在服务器命令行执行sqlcmd命令确认是否能正常调用,缺失的话安装对应版本的SQLCMD工具即可。
修正后可直接测试的代码示例
DECLARE @query nvarchar(max) = 'select top (1) * from 替换为你的业务库名.dbo.employees'; EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Email', @recipients = 'me@gmail.com', @query = @query, @execute_query_database = '替换为你的业务库名', @query_attachment_filename = 'employees.csv', @attach_query_result_as_file = 1, -- 显式指定将查询结果作为附件 @query_result_separator = ',', -- 定义csv分隔符为逗号 @query_result_header = 1, -- 保留表头 @body_format = 'HTML', @subject = 'Test';
内容的提问来源于stack exchange,提问作者EbertB
相关产品推荐
相关产品推荐

