使用SQL Server 2005发送电子邮件:我是否使用游标?

时间:2012-06-18 19:17:22

标签: sql sql-server

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

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

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 ......?

1 个答案:

答案 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