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
你爲什麼不有'Barcode_Num'唯一約束?這將比你的代碼更有效率(也避免你目前擁有的競態條件) –
,因爲我從C#winform中的用戶得到這個 –
這不是任何理由。只需在該列上創建一個唯一約束,然後SQL Server將爲您管理該約束。然後,您可以捕獲重複鍵錯誤,而不是提高自己需要捕獲的錯誤。 –