2012-11-19 23 views
2

我編寫了一個可以節省卡的存儲過程。我想,當Barcode_Num是重複的,不允許添加和顯示信息(我知道必須從RAISERROR使用),但我想設置RAISERROR,這是數設置消息:在存儲過程中爲RAISERROR設置編號和消息

卡號碼10000001(EX)是重複的,你不允許加這個

我設置了這個,但沒有奏效。

ALTER PROCEDURE [dbo].[SaveCards] 
    @Barcode_Num int 
    ,@Card_Status_ID int 
    ,@Card_Type_ID int 
    ,@SaveDate varchar(10) 
    ,@Save_User_ID int 

AS 
BEGIN 
    BEGIN TRAN Entrance 
    Begin Try 
    if (select COUNT(*) from TBL_Cards where Barcode_Num = @Barcode_Num) = 0 
    begin 
    INSERT INTO [Parking].[dbo].[TBL_Cards] 
       ([Barcode_Num] 
       ,[Card_Status_ID] 
       ,[Card_Type_ID] 
       ,[Save_Date]   
       ,[Save_User_ID]) 

     VALUES 
       (@Barcode_Num 
       ,@Card_Status_ID 
       ,@Card_Type_ID 
       ,@SaveDate 
       ,@Save_User_ID 
       ) 
      end 
      else 
       begin 
       -- 
       declare @EndCardID int ; 
      set @EndCardID= ( select Barcode_Num from TBL_Cards WHERE TBL_Cards.Card_ID = (SELECT MAX(Card_ID) 
          FROM TBL_Cards )) 

       declare @CardID int ; 
       set @CardID= (select Barcode_Num from TBL_Cards where Barcode_Num = @Barcode_Num) 

        --RAISERROR('قبلا کارتی ب اين شماره ثبت شده است.',50000,1) 
       RAISERROR((N'the card number %d is duplicate',@CardID),50000,1); 
      end 
     COMMIT TRAN Entrance 
     END TRY 

     Begin CATCH 
      ROLLBACK TRAN Entrance 
      DECLARE @Error_Number int 
      SET @Error_Number = ERROR_NUMBER() 
      DECLARE @Error_Message varchar(max) 
      SET @Error_Message = ERROR_MESSAGE() 
      DECLARE @Log_Error_ID int 
      EXEC [LogError] @Error_Number, @Error_Message OUTPUT, @Log_Error_ID, @Save_User_ID 

      IF @Error_Message IS NOT NULL 
       RAISERROR(@Error_Message,16,1) 
      ELSE 
       RAISERROR((N'the card number %d is duplicate',@CardID),16,1) 

      END CATCH 
    END 

    Begin CATCH 
      ROLLBACK TRAN Entrance 
      DECLARE @Error_Number int 
      SET @Error_Number = ERROR_NUMBER() 
      DECLARE @Error_Message varchar(max) 
      SET @Error_Message = ERROR_MESSAGE() 
      DECLARE @Log_Error_ID int 
      EXEC [LogError] @Error_Number, @Error_Message OUTPUT, @Log_Error_ID, @Save_User_ID 

      IF @Error_Message IS NOT NULL 
       RAISERROR(@Error_Message,16,1) 
      ELSE 
       RAISERROR('قبلا کارتی با اين شماره ثبت شده است',16,1) 

      END CATCH 

    END 
+2

你爲什麼不有'Barcode_Num'唯一約束?這將比你的代碼更有效率(也避免你目前擁有的競態條件) –

+0

,因爲我從C#winform中的用戶得到這個 –

+4

這不是任何理由。只需在該列上創建一個唯一約束,然後SQL Server將爲您管理該約束。然後,您可以捕獲重複鍵錯誤,而不是提高自己需要捕獲的錯誤。 –

回答

1

如果你想使用RAISERROR小號格式化工具,參數來後的嚴重程度和狀態參數:

RAISERROR('the card number %d is duplicate',16,1,@CardID)