我不确定何时使用游标是合适的。
我需要在运行某个更新某些表的存储过程后发送电子邮件。所以,如果
table1.field1 = "value" and
(select count(*)
from table1 join table2
on table2.table1_id = table1.id) > 20
然后需要发送一封电子邮件,以满足那些满足这些条件的table1中的所有内容。在电子邮件中,我需要包括table1.field2和table2.field3等等......
我能想到的唯一方法是获取table1中符合这些条件的行的数据集,然后使用游标来完成它。我以前从未使用过从SQL Server发送电子邮件而且我不知道我的选项...我之前从未使用过光标(虽然我知道如何)因为我学会了回避它们。
感谢。
修改
使用while循环:所以...我可能想将所需的所有信息都推送到临时表中(从table1中选择* where(conditions))然后启动一个while循环,遍历结果数据集的每一行我的临时表。 (WHILE i = 1 to(从#temp中选择count(*))/汇编电子邮件发送电子邮件/下一步)...那么引用/指向#temp我应该是哪一行的最佳方式是什么?用于每个循环迭代?我可以给#temp一个身份(1,1)或使用row_number()......对吗?我猜?看起来我只是想通过这样做来编写自己的光标吗?我们假设我们设置@subject =(选择'Site'& field2&'从#temp中得到'& field1的值,其中temp_id_or_row_number = @i)然后为每个循环增加@i ......?
答案 0 :(得分:3)
我使用了与this article类似的内容
我曾经构建直接html,然后使用sp_send_dbmail
在html格式的邮件中使用它。
这些存储过程可能会变得混乱
我从未使用游标 - 有几个存储过程有WHILE循环发送多个电子邮件
WHILE (condition)
begin
end
这是一个完整的例子;希望它有所帮助:
/*
drop table #the_table
drop table #Emails
*/
create table #the_table
( [Email] varchar(50),
[Date] datetime,
[Amount] decimal(12, 2))
insert into #the_table
values
( 'example@googlemail.co.uk', '2012-1-1', 10),
( 'example@googlemail.co.uk', '2012-1-3', 10),
( 'foo@bar.co.uk', '2012-1-3', 20),
( 'foo@bar.co.uk', '2012-1-5', 10)
--get a list of email addresses
SELECT
Email
, ROW_NUMBER() OVER(ORDER BY [Email]) AS [Counter]
INTO #Emails
FROM #the_table
GROUP BY Email
DECLARE @html VARCHAR(8000)
DECLARE @Recipient VARCHAR(100)
DECLARE @row INT = 1
WHILE @row <= (SELECT COUNT(*) FROM #Emails)
BEGIN
SET @Recipient= (SELECT [Email] FROM #Emails WHERE [Counter] = @row)
--start building the html string
SELECT @html = '<html><p>Hello World.</p>'
SELECT @html = @html + '<p><table border="1"><tr><th>Date</th><th>Amount</th></tr>'
SELECT
@html =
@html +
('<tr><td>' + CONVERT(VARCHAR(6), [Date])
+ '</td><td>$' + LEFT(CONVERT(VARCHAR(20), CONVERT(MONEY,Amount),1), LEN(CONVERT(VARCHAR(20), CONVERT(MONEY,Amount),1))-3) + '</td></tr>')
FROM #the_table
WHERE [Email] = @Recipient
SELECT @html = @html + '</table></p>'
--finish building the html string
SELECT @html = @html + '<p></p></html>'
DECLARE @mySubject VARCHAR(100)
SET @mySubject = 'TESTING 1-2-3'
EXEC msdb..sp_send_dbmail
@recipients = @Recipient
, @subject = @mySubject
, @body_format = 'html'
, @body = @html
SET @Row = @Row +1
END