使用代理作业执行sp_send_dbmail:无法初始化sqlcmd库

时间:2017-02-27 19:48:33

标签: sql sql-server sql-server-2016 sp-send-dbmail

我正在执行一个SP,它动态构建从多个数据库收集的全局临时数据表。在这个SP的末尾是这行代码:

Exec msdb.dbo.sp_send_dbmail
    @profile_name = @dbmailProfileName,
    @recipients = @emailRecipents,
    @subject = @subject,
    @body = @body,
    @query = 'Select * From tempdb..##MyTempTable'

当我手动执行它时,此SP工作正常,但是,当我让我的服务器代理作业运行它时,它失败并出现以下错误:

Message
Executed as user: WORKGROUP\MyServer2016$. Failed to initialize sqlcmd library with error number -2147467259. [SQLSTATE 42000] (Error 22050)  Failed to initialize sqlcmd library with error number -2147467259. [SQLSTATE 42000] (Error 22050).  The step failed.

评论SP的@query部分可以正常工作,但由于我需要通过电子邮件发送数据,因此无用。

3 个答案:

答案 0 :(得分:0)

我知道这是一种安全问题,但我缺乏DBA技能在这里打败了我。但是,我找到了一个解决方案,它起作用,不完全是我想要的,但它确实有效。

编辑作业步骤以在我的工作登录中包含执行:

Execute As Login='MyUser'
GO
exec DBNAME.dbo.SPNAME
GO
Revert
GO

由于MyUser可以手动运行此事,因此我执行了登录。

答案 1 :(得分:0)

然后遇到同样的错误,经过多次尝试和错误尝试,又弹出另一个错误:

  The EXECUTE permission was denied on the object 'xp_sysmail_format_query',
  database 'mssqlsystemresource', schema 'sys'.

我将用户添加到master数据库中的public角色,然后为用户添加了此权限:

  grant execute on xp_sysmail_format_query to [myuser]

似乎数据库邮件依赖于此存储的过程。完成此操作后,电子邮件工作正常。注意:我以指定用户身份运行作业。

答案 2 :(得分:-1)

您是否尝试过使用@execute_query_database参数?如果这不起作用,请尝试将Sql Server Agent帐户作为sysadmin添加到Sql Server