【发布时间】:2021-08-30 11:22:29
【问题描述】:
我正在尝试发送一封电子邮件,其中包含 SQL Server 中存储过程调用的结果。
declare @querytext nvarchar(100)
set @querytext = 'sp_get_SPresults @item_name = ''Name of Group'''';
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'My Email',
@recipients = 'anaddress@adomain.com',
@body = 'Email',
@subject = 'Suitable Subject' ,
@query = @querytext,
@attach_query_result_as_file = 1,
@query_result_header = 1,
@query_no_truncate = 1;
但是当我运行它时,我得到了一个
消息 22050,第 16 层,状态 1,第 23 行 初始化 sqlcmd 库失败,错误号 -2147467259 错误。
当我在 SQL Server 中发送测试电子邮件时,它可以正常发送。即使只是将@querytext 设置为"select * from [Table]" 也不起作用。我在其他地方看到包括@query_result_header=1 可以解决此类问题,但在这里似乎没有什么不同。
任何帮助将不胜感激。
谢谢
【问题讨论】:
-
我怀疑这里有 2 个问题。首先,根据您所说的尝试,我的阅读表明应将
@query_result_header设置为0而不是1。我怀疑这样做的原因是当您尝试发送的数据集太大时,因此您需要截断结果;让标题仍然溢出它,因为它确保数据集适合,而不是标题+数据集。但是,理想情况下,如果您想通过电子邮件发送如此大的数据集,请将逻辑转移到其他地方。 -
尝试通过限定数据库和模式名称来调用存储过程,例如
'exec MyDatabase.dbo.sp_get_SPresults @item_name=''Name of Group''''; -
另外... 在命名程序时避免使用 sp 前缀。 SQL Server 使用此前缀来指定系统过程。如果存在同名的系统过程,使用前缀可能会导致应用程序代码中断。_ REF:CREATE PROCEDURE。
-
然而,我怀疑真正的原因是您缺少参数
execute_query_database(请参阅Arguments),因此您尝试运行S特殊 P在msdb的上下文中处理sp_get_SPresults;程序sp_send_dbmail存在的数据库。虽然我不认识sp_get_SPresults;这不是记录在案的S特殊P程序。 -
您是否正确设置了 DB Mail,配置文件
My Email是否已完全设置?