Вам нужно обернуть IF
.Что происходит в вашем коде, так это то, что вы ожидаете что-то вроде этого
IF EXISTS
{
UPDATE
RAISE ERROR IF BAD
}
ELSE
{
INSERT
RAISE ERROR IF BAD
}
Но вместо этого вы получите
IF EXISTS
UPDATE
IF ERROR
RAISE ERROR
ELSE
INSERT
IF ERROR
RAISE ERROR
Итак, вот как должен выглядеть ваш код:
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)
BEGIN
UPDATE TargetTable
SET
TargetTableNonPkItemId = @TargetTableNonPkItemId,
OtherField = @OtherField
WHERE BaseTableId = @BaseTableId
IF @@ERROR <> 0
BEGIN
RAISERROR('Error updating TargetTable', 16, 1)
ROLLBACK TRAN
RETURN
END
END
ELSE
BEGIN
INSERT INTO TargetTable(BaseTableId, TargetTableNonPkItemId, OtherField)
VALUES (@BaseTableId, @TargetTableNonPkItemId, @OtherField)
IF @@ERROR <> 0
BEGIN
RAISERROR('Error inserting TargetTable', 16, 1)
ROLLBACK TRAN
RETURN
END
END
COMMIT TRAN
END