1

我不确定何时适合使用游标。

在运行某个更新某些表的存储过程后,我需要发送电子邮件。因此,如果

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中选择*(条件)),然后启动一个遍历结果数据每一行的while循环设置在我的临时表中。(WHILE i = 1 to (select count(*) from #temp) / assemble e-mail send e-mail / next)...那么参考/指向我应该是#temp的哪一行的最佳方法是什么用于每个循环迭代?我可以给#temp 一个身份(1,1)或使用row_number()......对吗?我猜?不过,似乎我只是想通过这样做来编写自己的光标?假设我们设置@subject = (select 'Site ' & field2 & ' has a value of ' & field1 from #temp where temp_id_or_row_number = @i) 然后为每个循环增加@i ...?

4

1 回答 1

3

我使用了与这篇文章类似的东西, 我用来构建直接 html,然后在使用 .html 的 html 格式邮件中使用它sp_send_dbmail。这些存储过程可能会变得混乱

我从未使用过游标 - 有几个存储过程,其中有 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
于 2012-06-18T19:30:22.210 回答