2016-10-12 146 views
-1

創建存儲過程的原因是要安排一項工作,使用SQL Server數據庫郵件向我們的員工(協調員)發送一份雙週報告。SQL Server:存儲過程併發送dbmail

我在使它以正確的方式工作時遇到問題。我通常不用光標工作,但找不到其他選擇。 這是問題。我通過設置條件測試了查詢,只發送給一個具有一條記錄的協調員「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

有兩個結束。是在一個錯誤的地方。 – Messi