【问题标题】:Passing Cursor Result to send_dbmail as a Parameter将光标结果作为参数传递给 send_dbmail
【发布时间】:2018-10-17 10:53:06
【问题描述】:

我以前从未使用过游标,并且在阅读时,这可能不是最好的方法,因此请务必提出建议。

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

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 查询,并为每个结果发送一封电子邮件。

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

Msg 22050, Level 16, State 1, Line 0 格式查询错误,可能 无效参数

消息 14661,级别 16,状态 1,程序 sp_send_dbmail,第 504 行 [批处理开始第 0 行]

查询执行失败:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您需要添加'':

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

    注意可能的 SQL 注入。


    它是如何工作的:

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

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

    请记住,ORDER BY PM 对于一个值不会改变任何内容。

    【讨论】:

    • 哇,多么简单的解决方案!正是我需要的,谢谢!一旦达到时间最短时间限制,我会将其标记为解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多