SQL повторно выполняет хранимую процедуру в блоке try catch - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть хранимая процедура, которая выполняет MERGE.Учитывая объем трафика, кажется, что два запроса вызывают INSERT вместо UPDATE одновременно.Один из этих запросов не выполняется из-за ограничения внешнего ключа.Если я помещу свой оператор слияния в try catch и попытаюсь повторно выполнить sproc, я предполагаю, что в этот раз он выполнит часть UPDATE MERGE и завершится успешно.Мысли об этом, считается ли это хорошей / плохой практикой?

Я использую SQL Server 2008, если это имеет значение.

ура заранее

Ответы [ 2 ]

0 голосов
/ 20 августа 2015
-- 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; 
0 голосов
/ 02 апреля 2012

Вы можете продублировать его в блоке try / catch, но лучшим решением, вероятно, является решение проблемы блокировки при одновременной работе.До утверждения слияния канонический способ достижения чего-либо подобного заключается в следующем:

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)...

Я также рекомендую тестировать параллелизм, используя http://www.datamanipulation.net/sqlquerystress/

...