SQL在try-catch块中重新执行存储过程

SQL在try-catch块中重新执行存储过程,sql,stored-procedures,merge,try-catch,Sql,Stored Procedures,Merge,Try Catch,我有一个正在进行合并的存储过程。考虑到通信量,两个请求似乎同时调用INSERT而不是UPDATE。其中一个请求由于外键约束而失败。如果我将merge语句放在try-catch中并尝试重新执行存储过程,那么我假设它这次将运行合并的更新部分并成功。关于这一点的想法,这被认为是好的/坏的做法吗 如果有必要的话,我正在使用SQL Server 2008 提前欢呼您可以在try/catch块中复制它,但更好的解决方案可能是在并发运行时解决锁定问题。在merge语句之前,实现类似此功能的规范方法如下: BE

我有一个正在进行合并的存储过程。考虑到通信量,两个请求似乎同时调用INSERT而不是UPDATE。其中一个请求由于外键约束而失败。如果我将merge语句放在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,我建议您执行以下操作:

将dbo.Table与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;