sql-server – 为什么sp_send_dbmail在SQL Agent作业中失败?

前端之家收集整理的这篇文章主要介绍了sql-server – 为什么sp_send_dbmail在SQL Agent作业中失败?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的查询,当帐户被禁用超过30天时,我会向我们的AD帐户管理员发送电子邮件通知.当我自己运行它,以SA身份登录时,它可以正常工作,但在sql Server代理作业中运行时会失败.

这是查询,替换了特定于业务的项目和对象名称

DECLARE @QueryString varchar(max)
SET @QueryString = 'Select TrackingTable.Username FROM dbName.Schema.TrackingTable inner join dbName.Schema.viewName on DisabledAccounts.username = viewName.username WHERE DATEDIFF(dd,DateDisabled,GETDATE()) > 25 AND viewName.OU = ''InactiveAccounts'''
EXEC msdb.dbo.sp_send_dbmail  @profile_name = 'Profile',@body = 'This is the body text. Nothing interesting here.
',@recipients = 'me@mydomain.tld',@subject='Account status update',@query = @QueryString,@importance = 'High'

当我将其作为SA运行时,将发送消息.在sql Server代理作业中,我收到此错误

Executed as user: DOMAIN\MemberOfDomainAdmins. Error formatting query,probably invalid parameters [sqlSTATE 42000] (Error 22050).  The step Failed.

作业执行的域用户在msdb上分配了db_owner角色,并为附加到消息的查询分配了数据库.它在两个数据库上的默认架构都是dbo.

它还在服务器上分配了sysadmin角色,并且是msdb上DatabaseMailuserRole的成员.它还具有对查询使用的数据库邮件配置文件的私有和公共访问权限.

我在网上看过几十个相同问题的例子,但我已经采取了在我看到的例子中解决这个问题的步骤.我还能尝试什么?

解决方法

我今天早上想通了.问题出在DATEADD函数上.当它在EXECUTE语句中(这是sql Server代理程序作业将如何运行它)时,间隔必须是特定的datepart(day),而不是其中一个标记(“dd”).

所以,这个函数:DATEDIFF(dd,GETDATE())

需要更像这样:DATEDIFF(day,GETDATE())

那里有多次调用函数,但你明白了.

以下是我弄清楚的方法:我在sql Server Management Studio脚本中将作业作为新查询编辑器文档中的CREATE脚本.一旦我找到了我试图运行的步骤,我就把它复制出来了.多汁的东西看起来像这样:

@command = N'[我的查询]’

我将该组行复制到一个新窗口,并为命令变量添加了一个DECLARE.

最后,我使用了EXECUTE(@command)AS USER ='[作业运行的用户]’来查看会发生什么.以这种方式运行查询,我得到了比我从日志中获得的更详细的错误消息.

我现在已经纠正了,而且工作完美无缺.

猜你在找的MsSQL相关文章