2015-10-18 46 views
0
CREATE PROCEDURE [dbo].[SP_StoredProc_Status] @Procname varchar(50) 
AS 

BEGIN 
    ---- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT 
    SET NOCOUNT ON; 
    SET DATEFORMAT dmy; 

    BEGIN TRY 
     -- Check if the procedure is already running. 
     -- This check is MANDATORY in all stored procs. 
     IF EXISTS (
       SELECT * 
       FROM IMP_StoredProcRunTracking 
       WHERE StoredProcName = @Procname 
        AND DATEADD(hh, 1, ISNULL(StartedAt, DATEADD(year, - 50, GETDATE()))) > GETDATE() 
       ) 
      BEGIN 
       RETURN 
      END 
     ELSE 
      BEGIN 
       MERGE INTO IMP_StoredProcRunTracking AS Target 
       USING (
        SELECT @procname StoredProcName 
        ) AS Source 
        ON Target.StoredProcName = Source.StoredProcName 
       WHEN MATCHED 
        THEN 
         UPDATE 
         SET Target.StartedAt = GETDATE() 
       WHEN NOT MATCHED 
        THEN 
         INSERT (
          StoredProcName 
          ,StartedAt 
          ) 
         VALUES (
          @Procname 
          ,GETDATE() 
          ); 
         end 

    END 
+1

我添加了sql-server標籤,因爲它看起來像SQL Server。 –

+0

請認真編輯問題以解釋您希望此代碼執行什麼操作 – Mousey

+0

而且它看起來像您正在嘗試編寫您自己的sp_getapplock版本:https://msdn.microsoft.com/en-us/library/ms189823.aspx –

回答

1

你缺少一個end try/begin catch/end catch實際處理您已啓動異常處理。

1
Create PROCEDURE [dbo].[SP_StoredProc_Status] @Procname varchar(50) 
AS 

BEGIN 
    ---- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT 
    SET NOCOUNT ON; 
    SET DATEFORMAT dmy; 

    BEGIN TRY 
     -- Check if the procedure is already running. 
     -- This check is MANDATORY in all stored procs. 
     IF EXISTS (
       SELECT * 
       FROM IMP_StoredProcRunTracking 
       WHERE StoredProcName = @Procname 
        AND DATEADD(hh, 1, ISNULL(StartedAt, DATEADD(year, - 50, GETDATE()))) > GETDATE() 
       ) 
      BEGIN 
       RETURN 
      END 
     ELSE 
      BEGIN 
       MERGE INTO IMP_StoredProcRunTracking AS Target 
       USING (
        SELECT @procname StoredProcName 
        ) AS Source 
        ON Target.StoredProcName = Source.StoredProcName 
       WHEN MATCHED 
        THEN 
         UPDATE 
         SET Target.StartedAt = GETDATE() 
       WHEN NOT MATCHED 
        THEN 
         INSERT (
          StoredProcName 
          ,StartedAt 
          ) 
         VALUES (
          @Procname 
          ,GETDATE() 
          ); 
         end 


    END TRY 

    BEGIN CATCH 
    -- Execute error retrieval routine. 

    END CATCH 

END 
+0

非常感謝戈登。我是SQL新手,並處於初學者階段。不會做出這樣愚蠢的錯誤。非常感謝 – VSR