2

TRY..CATCHとTRANSACTIONを使用してテーブルに列を追加しようとしているこのトランザクションを書き込もうとしています。これが私のコードです。ただし、問題は、列がテーブルにすでに存在し、catchブロックを実行する必要があるが、catchブロックが実行されておらず、トランザクションがロールバックされておらず、selecterror_numberステートメントも実行されていないことです。

BEGIN TRY
    BEGIN TRANSACTION;
        ALTER TABLE ONADJ ADD BR_INIT CHAR (3) NULL REFERENCES BRANCH(BR_INIT)
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER() AS ERRORNUMBER,ERROR_MESSAGE() AS ERRORMESSAGE;

    IF (XACT_STATE()) = -1
    BEGIN
        PRINT
            N'THE TRANSACTION IS IN AN UNCOMMITTABLE STATE. ROLLING BACK TRANSACTION.'
        ROLLBACK TRANSACTION;
    END;

    IF (XACT_STATE()) = 1
    BEGIN
        PRINT
            N'THE TRANSACTION IS COMMITTABLE. COMMITTING TRANSACTION.'
        ROLLBACK TRANSACTION;   
    END;
END CATCH
4

2 に答える 2

4

トランザクションを使用して TRY CATCH が機能することを期待する代わりに、列がテーブルに存在するかどうかを確認し、存在しない場合は、次のように変更クエリを使用することをお勧めします -

if Not Exists(select * from sys.columns where Name = N'columnName'   
                and Object_ID = Object_ID(N'tableName')) 

begin 

-- Your alter statement

end 
于 2010-07-30T10:22:49.240 に答える
3

sys.columnsを使用する代わりに、データベース全体の標準であるInformation_Schemaオブジェクトを使用します。構文も単純で覚えやすいです。

If Not Exists (Select * From Information_Schema.Columns
  Where Table_Schema = 'SchemaName' -- or dbo if you aren't using schemas
  And Table_Name = 'TableName'
  And Column_Name = 'ColumnName'))

Begin

-- Your alter statement

End
于 2012-03-28T15:00:55.147 に答える