在 SQL Server 2014 中使用 sp_send_dbmail 时出现一般性故障

Generic failure using sp_send_dbmail in SQL Server 2014

我正在尝试使用 sp_send_dbmail 通过 SQL Server 2014 中的 SQL 代理作业发送查询结果。我相信我已经设置了我的 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.

谷歌搜索此错误消息没有找到任何有用的信息,可能是由于一般错误编号。有人对此错误消息有一些了解吗?

我发现尽管我的查询 window(用于测试)和 SqlAgent 作业都指向我想要的数据库,但 sp_send_dbmail 似乎没有任何数据库上下文。我原来的 post 失败了,因为 SQL 不知道去哪里 运行 SELECT * FROM TestTable。解决方法是通过在 @query 参数中完全限定您的 table 来为 sp_send_dbmail 提供数据库上下文:

@query = 'SELECT id FROM testDB.dbo.TestTable'

或通过提供可选的 @execute_query_database 参数:

@execute_query_database = 'testDB'

为用于 运行 SQL 服务器 Agent.Below 的帐户启用系统管理员服务器角色。

错误

修复

现在 SQL 服务器作业 运行 没有任何错误,我收到一封来自 dbmail 的电子邮件。

您可能会遇到此错误还有另一个原因;如果查询有问题。

在我们的例子中(注意这不是由于语法错误;注意遗漏的引号):

DECLARE @EmailQuery varchar(max) = 'select 
                                    e.Field1,
                                    REPLACE(REPLACE(e.ExceptionReason, CHAR(13), ''), CHAR(10), '') ExceptionReason,
                                    e.UserName
                                from dbo.tblException e'

我们按如下方式更正后,它运行良好:

DECLARE @EmailQuery varchar(max) = 'select 
                                    e.Field1,
                                    REPLACE(REPLACE(e.ExceptionReason, CHAR(13), ''''), CHAR(10), '''') ExceptionReason,
                                    e.UserName
                                from dbo.tblException e'