我以前从未使用过游标,在阅读时,这可能不是最好的方法,所以无论如何都要提出建议。
我试图将游标的结果集传递给查询。这是我到目前为止所做的:
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'。
我不知道发生了什么事。有什么想法吗?
答案 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
一个值不会改变任何内容。