比方说,我有一个如下所示的表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)
答案 0 :(得分:0)
假设您正在发送字符串,我想查询中的@id有问题。
您应该尝试:
@query =
'SELECT Value FROM TEST WHERE FK_ForeignKey = ' + CAST(@id as varchar(5))