Sql begin end无论我是否有一条语句,它使维护时更容易避免错误,使意图更清晰。无论我是否有一条语句,我都会编写begin end,它使维护时更容易避免错误,使意图更清晰。 CREATE PROCEDURE [dbo].[proc_BaseTable_Ta

Sql begin end无论我是否有一条语句,它使维护时更容易避免错误,使意图更清晰。无论我是否有一条语句,我都会编写begin end,它使维护时更容易避免错误,使意图更清晰。 CREATE PROCEDURE [dbo].[proc_BaseTable_Ta,sql,tsql,sql-server-2005,stored-procedures,transactions,Sql,Tsql,Sql Server 2005,Stored Procedures,Transactions,begin end无论我是否有一条语句,它使维护时更容易避免错误,使意图更清晰。无论我是否有一条语句,我都会编写begin end,它使维护时更容易避免错误,使意图更清晰。 CREATE PROCEDURE [dbo].[proc_BaseTable_TargetTable_Update] ( @BaseTableId bigint, @BaseTableTypeId bigint, @Alias nvarchar(max), @TargetTableNo


begin end无论我是否有一条语句,它使维护时更容易避免错误,使意图更清晰。无论我是否有一条语句,我都会编写begin end,它使维护时更容易避免错误,使意图更清晰。
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
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
CREATE PROCEDURE [dbo].[proc_BaseTable_TargetTable_Update]  
( @BaseTableId        bigint
, @BaseTableTypeId        bigint
, @Alias      nvarchar(max)
, @TargetTableNonPkItemId bigint
, @OtherField     nvarchar(max) = NULL ) 
AS  

BEGIN TRY
BEGIN TRAN      
    UPDATE BaseTable          
    SET Alias = @Alias
    , BaseTableTypeId = @BaseTableTypeId
    , UpdatedOn = GETUTCDATE()     
    WHERE BaseTableId = @BaseTableId           

IF EXISTS(SELECT 1 FROM TargetTable WHERE BaseTableId = @BaseTableId)         
    UPDATE TargetTable             
    SET TargetTableNonPkItemId = @TargetTableNonPkItemId
        , OtherField = @OtherField         
    WHERE BaseTableId = @BaseTableId         
ELSE         
    INSERT INTO TargetTable(BaseTableId, TargetTableNonPkItemId, OtherField)         
    VALUES (@BaseTableId, @TargetTableNonPkItemId, @OtherField)  

IF @@TRANCOUNT > 0
    BEGIN
        COMMIT TRAN
    END 
END TRY

BEGIN CATCH

    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;

IF @@TRANCOUNT > 0
    BEGIN
        ROLLBACK TRAN
    END

END CATCH