Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2014中使用sp_send_dbmail的一般故障_Sql Server_Sp Send Dbmail - Fatal编程技术网

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很高兴知道它为您工作。向上投票:-)?这对我来说也是个问题。。。但我想知道是否有比“系统管理员”更有效的权限集?