我有一個正在執行MERGE的存儲過程。似乎給定了流量,兩個請求同時調用INSERT而不是UPDATE。其中一個請求由於外鍵約束而失敗。如果我把我的merge語句放在try catch中,並嘗試重新執行sproc,我假設它會運行MERGE的UPDATE部分,並且這次成功了。有關這方面的想法,它被認爲是好的/壞的做法?SQL在try catch塊內重新執行存儲過程
我正在使用SQL Server 2008,如果重要的話。
歡呼提前
我有一個正在執行MERGE的存儲過程。似乎給定了流量,兩個請求同時調用INSERT而不是UPDATE。其中一個請求由於外鍵約束而失敗。如果我把我的merge語句放在try catch中,並嘗試重新執行sproc,我假設它會運行MERGE的UPDATE部分,並且這次成功了。有關這方面的想法,它被認爲是好的/壞的做法?SQL在try catch塊內重新執行存儲過程
我正在使用SQL Server 2008,如果重要的話。
歡呼提前
您可以在try/catch塊複製它,但更好的解決方案可能是同時運行的時候,以解決鎖定。此前MERGE語句,規範的方式來實現這樣的事情如下:
BEGIN TRANSACTION;
UPDATE dbo.Table WITH (HOLDLOCK)
SET Col = @Val
WHERE Key= @Something;
IF @@ROWCOUNT = 0
INSERT INTO dbo.TABLE (Key, Col) VALUES (@Key, @Val);
COMMIT TRANSACTION;
所以,用MERGE,我建議你做以下幾點:
MERGE dbo.Table WITH (HOLDLOCK)
...
-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ('usp_GetErrorInfo', 'P') IS NOT NULL
DROP PROCEDURE usp_GetErrorInfo;
GO
-- Create procedure to retrieve error information.
CREATE PROCEDURE usp_GetErrorInfo
AS
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
GO
BEGIN TRY
-- Generate divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
-- Execute error retrieval routine.
EXECUTE usp_GetErrorInfo;
END CATCH;