Не пытаясь выяснить, почему у вас возникла проблема, я предлагаю вам переписать ваш SQL для использования команды MERGE.См. здесь .
Это позволяет вам указать, что делать, если есть дублирующаяся запись или нет.
В качестве примечания, если вы хотите обеспечить хранимую процедуруработает исключительно (вы намекали на это), вам нужно следующее:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE -- most restrictive
BEGIN TRY
BEGIN TRAN
DECLARE @LockResult int
SET @LockName = 'MyLockName'
EXEC @LockResult = sp_getapplock @Resource = @LockName, @LockMode = 'Exclusive', @LockTimeout = 0
if @LockResult <> 0 begin
SET @Failed = 1
end else begin
-- WORK HERE
end
-- FINALIZE TRANSACTION
END TRY
BEGIN CATCH
-- CATCH CODE
END CATCH
SET TRANSACTION ISOLATION LEVEL READ COMMITTED -- set back to default