1

いつカーソルを使用するのが適切なのかわかりません。

一部のテーブルを更新する特定のストアド プロシージャが実行された後に、メールを送信する必要があります。だからもし

table1.field1 = "value" and 
   (select count(*) 
      from table1 join table2 
        on table2.table1_id = table1.id) > 20 

次に、これらの条件を満たすテーブル 1 内のすべてに対して電子メールを送信する必要があります。メールには table1.field2 と table2.field3 などを含める必要があります...

これを行う唯一の方法は、これらの条件を満たす table1 の行のデータセットを取得し、カーソルを使用してそれを処理することです。以前に SQL Server から電子メールを送信したことがなく、オプションもわかりません... カーソルを使用したことがありません (方法は理解していますが)。

ありがとう。

編集:
whileループを使用:だから...おそらく必要なすべての情報を一時テーブルに押し込み(select * from table1 where (conditions))、結果のデータの各行を通過するwhileループを開始したい私の一時テーブルに設定します。(WHILE i = 1 to (select count(*) from #temp) / 電子メールを組み立てる 電子メールを送信する / 次へ)... 次に、#temp のどの行を参照/ポイントするのが最善の方法ですか?ループの反復ごとに使用しますか? #temp に ID(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形式のメールで使用するために使用したこの記事に似たものを使用しました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 に答える