2016-10-12 5 views
-1

ストアドプロシージャを作成する理由は、SQL Serverのdbメールを使用して隔週のレポートをスタッフ(コーディネータ)に送信するようにジョブをスケジュールすることです。SQL Serverストアドプロシージャとdbmailの送信

私はそれが正しい方法で動作するように問題を抱えています。私は通常、カーソルで動作しませんが、他の選択肢を見つけることができませんでした。 ここに問題があります。私は設定基準でクエリをテストし、1つのコーディネータにのみ "if @Coord_Email = '[email protected]'というn.id = '43422546'"というレコードを送信しました。しかし、クエリは5分以上実行されていたので、私はそれをキャンセルしなければなりませんでした。

ALTER PROCEDURE [dbo].[sp_MZ_Coord_rpt_s9] 
AS 
BEGIN 
    DECLARE @Member_ID VARCHAR(20) 
    DECLARE Report_S9 CURSOR FOR 
     SELECT id 
     FROM name 
     WHERE status = 'a' 

    OPEN Report_S9 

    FETCH NEXT FROM Report_S9 INTO @member_ID 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @Coord_ID Varchar(20) 
     DECLARE @CO_ID Varchar(20) 
     DECLARE @Coord_Name Varchar(50) 
     DECLARE @Coord_Email Varchar(50) 

     SELECT @CO_ID = ID 
     FROM Relationship 
     WHERE id = @Member_ID 

     SELECT @Coord_ID = target_id 
     FROM Relationship 
     WHERE RELATION_TYPE = 'CO' 

     SELECT @Coord_Name = FULL_NAME 
     FROM Name 
     WHERE ID = @Coord_ID 

     SELECT @Coord_Email = email 
     FROM Name 
     WHERE id = @Coord_ID 

     IF @Coord_Email <> '' 
     BEGIN 
      SELECT 
       n.id, n.CO_ID, n.FULL_NAME, a.TRANSACTION_DATE, a.UF_1, r.TARGET_ID 
      FROM name n 
      INNER JOIN activity a ON n.id = a.id 
      INNER JOIN Tops_Profile tp ON a.id = tp.ID 
      INNER JOIN Relationship r ON n.CO_ID = r.ID 
      WHERE 
       n.id = @member 
       AND UF_1 <> '' 
       AND (DATEDIFF(dd, TRANSACTION_DATE, GETDATE()) < 2) 
       AND r.RELATION_TYPE = 'co' 
      ORDER BY 
       TRANSACTION_DATE 

      EXEC msdb..sp_send_dbmail 
        @profile_name = 'TOPS.ADMIN', 
        @recipients = @Coord_Email, 
        [email protected]_copy_recipients = , 
        @subject = 'S9 Report' 
End 

      FETCH NEXT FROM Report_S9 INTO @member_ID 
    END 

    CLOSE Report_S9 
    DEALLOCAT Report_S9 

    End 

ご協力いただきまして誠にありがとうございます。

+0

なぜこれをトランザクションでラッピングしますか?トランザクションをロールバックするコードはなく、実行した場合でもロールバックするものはありません。また、あなたのsp_接頭辞の習慣を変更することを考慮する必要があります。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+0

は前とは別のスクリプトでした。私はそれを修正しました。他に何かお勧めしますか? – Messi

+0

ここに問題があります。あなたは "私はそれが正しい方法で働くことに問題を抱えています"と述べました。どういう意味ですか?それは「正しい方法」をしているかしていないのですか?何が間違っているのかをお手伝いしますが、何が間違っているのかを説明しなければなりません。 –

答えて

1

FETCH NEXTはヌルチェックの対象外です。何もする必要がないときでも、ループを続行する必要があります。

+0

良いキャッチ。 OPにemail = ''の行がある場合、彼らは無限ループを作成しました。 –

+0

2つの終わりがあります。間違った場所にいた – Messi

関連する問題