循环执行时,sp​​_send_dbmail错误

时间:2019-01-23 10:21:44

标签: sql-server

比方说,我有一个如下所示的表TEST:

    ID  |  Value |  FK_ForeignKey
    ---------------------------
    1   |  Foo   |  3
    2   |  Bar   |  4

和另一个表格FK:

    ID  |  Email
    -------------
    3   |  Foo@bar.com
    4   |  Bar@foo.com

我有以下代码:

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'test'
, @recipients = @email
, @subject = 'test'
, @body= 'test'
, @query = @query
, @query_result_separator = ' '
, @query_result_no_padding = 1;

我需要将基于FK的某些值发送到某些电子邮件地址。

如果我给

@query = 
  'SELECT Value FROM TEST WHERE FK_ForeignKey = 3'

并运行它,它会正确发送带有结果的电子邮件。

如果我将其放入while循环并给出

@query = 
  'SELECT Value FROM TEST WHERE FK_ForeignKey = @id'

@id从表FK的MIN(ID)到MAX(ID),出现错误。

错误消息是:

[SQLSTATE 42000] (Error 22050)  Failed to initialize sqlcmd library with error number -2147467259.

我尝试了WHILE循环和CURSOR,但遇到了相同的问题。

我还尝试根据FK中有多少个ID,对@email进行硬编码以在一个地址上接收多封电子邮件。

我已经在线浏览过了,似乎每个人都指向安全权限,但是我不是从SQLAgent运行它,而是从SSMS查询窗口运行它。

TLDR:仅当不在循环中时,才能从SQL Server发送电子邮件。


在重新阅读我发布的内容后不久发现了问题。我想写我的问题很值得。我很尴尬,花了多长时间才注意到这个新手错误。

@query = 
  'SELECT Value FROM TEST WHERE FK_ForeignKey = @id'

应该已经

@query = 
  'SELECT Value FROM TEST WHERE FK_ForeignKey =' + CONVERT(varchar(1), @id)

1 个答案:

答案 0 :(得分:0)

假设您正在发送字符串,我想查询中的@id有问题。

您应该尝试:

@query = 
  'SELECT Value FROM TEST WHERE FK_ForeignKey = ' + CAST(@id as varchar(5))