Изменить таблицу в транзакции SQL Server - PullRequest
2 голосов
/ 30 июля 2010

Я пытаюсь написать эту транзакцию, в которой я пытаюсь добавить столбец в таблицу, используя TRY..CATCH и TRANSACTION. Вот мой код Но проблема в том, что столбец уже существует в таблице, и блок catch должен выполняться, но блок catch не выполняется, а транзакция не откатывается, а также оператор select error_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

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Вместо использования 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
3 голосов
/ 30 июля 2010

Вместо того, чтобы использовать транзакцию и ожидать, что TRY CATCH будет работать, лучшей альтернативой было бы проверить, существует ли столбец в таблице, а если нет, то использовать запрос alter, как показано ниже -

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

begin 

-- Your alter statement

end 
...