Sql server SQL Server 2014中使用sp_send_dbmail的一般故障
我正在尝试使用Sql server SQL Server 2014中使用sp_send_dbmail的一般故障,sql-server,sp-send-dbmail,Sql Server,Sp Send Dbmail,我正在尝试使用sp_send_dbmail通过SQL Server 2014中的SQLAgent作业发送查询结果。我相信我已正确设置了我的DBMail配置文件,但在运行此操作时: exec msdb.dbo.sp_send_dbmail @profile = 'TestProfile', @recipients = 'testmail@gmail.com', @subject = 'Test', @query = 'SELECT id FROM TestTable', @attach_query
sp_send_dbmail
通过SQL Server 2014中的SQLAgent作业发送查询结果。我相信我已正确设置了我的DBMail配置文件,但在运行此操作时:
exec msdb.dbo.sp_send_dbmail
@profile = 'TestProfile',
@recipients = 'testmail@gmail.com',
@subject = 'Test',
@query = 'SELECT id FROM TestTable',
@attach_query_result_as_file = 1,
@query_attachment_filename = 'TestValues.txt'
我收到以下错误消息:
Failed to initialize sqlcmd library with error number -2147467259.
谷歌搜索此错误消息没有发现任何有用的信息,可能是由于一般错误号。有人了解这个错误消息吗?我发现,尽管我的查询窗口(用于测试)和SqlAgent作业都指向我想要的数据库,但sp_send_dbmail似乎没有任何数据库上下文。我最初的帖子失败了,因为SQL不知道从哪里运行
SELECT*fromtesttable
。修复方法是通过在@query
参数中完全限定您的表,为sp_send_dbmail提供数据库上下文:
@query = 'SELECT id FROM testDB.dbo.TestTable'
@execute_query_database = 'testDB'
或者通过提供可选的@execute\u query\u数据库
参数:
@query = 'SELECT id FROM testDB.dbo.TestTable'
@execute_query_database = 'testDB'
为用于运行SQL server代理的帐户启用sysadmin服务器角色。下面是屏幕截图 错误 修复 现在SQL Server作业运行时没有任何错误,我收到了来自dbmail的电子邮件
出现此错误还有另一个原因;如果查询有问题 在我们的例子中,我们有(注意这不是由于语法错误;注意缺少引号): 我们按如下方式更正后,效果良好:
DECLARE @EmailQuery varchar(max) = 'select
e.Field1,
REPLACE(REPLACE(e.ExceptionReason, CHAR(13), ''''), CHAR(10), '''') ExceptionReason,
e.UserName
from dbo.tblException e'
是否为DBMail设置了实例?在SSMS中,右键单击对象资源管理器顶部的实例,然后选择Facets。将方面更改为表面积配置,并确保DatabaseMailEnabled=True;但DatabaseMailEnabled对于我的服务器是真的。这似乎不是我的问题。我今天继续测试,并将发布任何我发现似乎有用的东西。嗯,刚刚发现如果我删除
@query、@attach\u query\u result和@query\u attachment\u filename
,然后用一条简单的@body
消息替换它们,效果会很好。我一把@query
放回去,它就失败了。我可以通过SqlAgent看到这是一个权限问题,但我现在正试图从一个查询窗口与我的管理员用户一起运行该命令。您的SqlAgent用户帐户是否设置为sysadmin?不是sysadmin,但它具有高级权限。尽管我发现了问题:尽管我的查询窗口指向正确的数据库,但我的原始帖子中的脚本没有面向数据库的概念;您需要通过完全限定@query
变量中的表,或者指定@execute\u query\u数据库
参数来告诉它应该运行哪个上下文/db。以下任一项修复了我的问题:@query='select id from dbo.testDB.TestTable
或@execute\u query\u database='testDB'
这是我的修复方法。对于我来说,没有任何@execute\u query\u数据库
或完全限定表引用的组合能够解决这个问题。在我的例子中,@query
是跨两个不同数据库的连接,即使我将其全部放在一个视图中,我也无法使其工作,直到我遵循此建议并授予SQL代理系统管理权限为止。@N1njaB0b很高兴知道它为您工作。向上投票:-)?这对我来说也是个问题。。。但我想知道是否有比“系统管理员”更有效的权限集?