트랜잭션이 항상 실패하여 저장 프로 시저에 문제가 있습니다. 나는 그것이 IF EXISTS(SELECT 1 FROM TargetTable WHERE BaseTableId = @BaseTableId)
또는 그 주위의 코드가 구조화 된 방법이라고 생각하지만 트랜잭션이 항상 실패하지 않도록 스토어드 프로 시저를 수정하는 방법을 모르겠습니다. 모든 트랜잭션 코드를 제거하고 저장 프로 시저에서 트랜잭션없이 동일한 작업을 수행하면 작동합니다. 모든 업데이트 및/또는 삽입이 성공합니다.이 SQL Server 트랜잭션이 항상 실패하고 저장 프로 시저 구조를 수정하는 방법은 무엇입니까?
CREATE PROCEDURE [dbo].[proc_BaseTable_TargetTable_Update]
(
@BaseTableId bigint,
@BaseTableTypeId bigint,
@Alias nvarchar(max),
@TargetTableNonPkItemId bigint,
@OtherField nvarchar(max) = NULL
)
AS
-- NOTE: There is a problem with enabling tractions on this, the trans always fails
-- with the current structure, seemingly because of the SELECT 1 FROM TARGETTABLE
BEGIN
BEGIN TRAN
UPDATE BaseTable
SET
Alias = @Alias,
BaseTableTypeId = @BaseTableTypeId,
UpdatedOn = GETUTCDATE()
WHERE BaseTableId = @BaseTableId
IF @@ERROR <> 0
BEGIN
RAISERROR('Error updating BaseTable', 16, 1)
ROLLBACK TRAN
RETURN
END
IF EXISTS(SELECT 1 FROM TargetTable WHERE BaseTableId = @BaseTableId)
UPDATE TargetTable
SET
TargetTableNonPkItemId = @TargetTableNonPkItemId,
OtherField = @OtherField
WHERE BaseTableId = @BaseTableId
IF @@ERROR <> 0
BEGIN
RAISERROR('Error updating TargetTable', 16, 1)
ROLLBACK TRAN
RETURN
END
ELSE
INSERT INTO TargetTable(BaseTableId, TargetTableNonPkItemId, OtherField)
VALUES (@BaseTableId, @TargetTableNonPkItemId, @OtherField)
IF @@ERROR <> 0
BEGIN
RAISERROR('Error inserting TargetTable', 16, 1)
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
END
I alawys은 시작 끝을 작성하거나하지, 그것은 쉽게 유지 보수를하고 실수를 방지 할 수 있으며 의도가 명확합니다. – HLGEM