将游标结果传递给send_dbmail作为参数

时间:2018-05-07 15:16:43

标签: sql sql-server tsql sql-server-2008-r2 cursor

我以前从未使用过游标,在阅读时,这可能不是最好的方法,所以无论如何都要提出建议。

我试图将游标的结果集传递给查询。这是我到目前为止所做的:

DECLARE @PM varchar(50),
        @c1 as CURSOR
SET @c1 = CURSOR FOR
    SELECT PM
    FROM PMtable

OPEN @c1;
FETCH NEXT FROM @c1 INTO @PM;

WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @emailBody nvarchar(max)
        SET @emailBody = 'SELECT * FROM othertable WHERE PM = ' + @PM + ' ORDER BY PM';

        EXEC msdb.dbo.sp_send_dbmail
        @recipients = 'me@me.com',
        @subject = 'test',
        @query = @emailBody;

FETCH NEXT FROM @c1 INTO @PM;
END
CLOSE @c1;
DEALLOCATE @c1;

我们的想法是将@emailBody查询结果集作为电子邮件中每个结果的电子邮件发送。例如,假设光标返回三个结果:Bob,Jim和Joe。我想循环运行游标的每个结果的@emailBody查询,并为每个结果发送一封电子邮件。

当我按原样运行查询时,收到错误消息:

  

消息22050,级别16,状态1,行0可能是格式化查询错误   参数无效

     

Msg 14661,Level 16,State 1,Procedure   sp_send_dbmail,第504行[批处理开始行0]

     

查询执行失败:

     

消息207,级别16,状态1,服务器SERVER,行9无效的列名称   “鲍勃”。

     

消息207,级别16,状态1,服务器SERVER,行1无效   列名'Bob'。

我不知道发生了什么事。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要添加''

SET @emailBody='SELECT * FROM othertable WHERE PM = ''' + @PM + ''' ORDER BY PM';

请注意可能的SQL注入。

工作原理:

  

Msg 207,Level 16,State 1,Server SERVER,Line 9无效的列名' Bob'。

SELECT * FROM othertable WHERE PM = Bob ORDER BY PM 
vs.
SELECT * FROM othertable WHERE PM = 'Bob' ORDER BY PM

请注意,ORDER BY PM一个值不会改变任何内容。