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

Passing Cursor Result to send_dbmail as a Parameter

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

我正在尝试将游标的结果集传递给查询。这是我目前所拥有的:

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 查询结果集作为电子邮件发送给游标中的每个结果。例如,假设游标 returns 三个结果:Bob、Jim 和 Joe。我想循环 运行 @emailBody 查询来自光标的每个结果,并为每个结果发送一封电子邮件。

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

Msg 22050, Level 16, State 1, Line 0 Error formatting query, probably invalid parameters

Msg 14661, Level 16, State 1, Procedure sp_send_dbmail, Line 504 [Batch Start Line 0]

Query execution failed:

Msg 207, Level 16, State 1, Server SERVER, Line 9 Invalid column name 'Bob'.

Msg 207, Level 16, State 1, Server SERVER, Line 1 Invalid column name 'Bob'.

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

您需要添加'':

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

注意可能的 SQL 注入。


工作原理:

Msg 207, Level 16, State 1, Server SERVER, Line 9 Invalid column name 'Bob'.

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

请记住,ORDER BY PM 一个值不会改变任何东西。