2010-07-30 23 views
2

我想寫這個事務,我試圖使用TRY..CATCH和TRANSACTION將列添加到表中。這是我的代碼。但問題是表中的列已經存在,catch塊應該執行,但catch塊沒有執行,並且事務沒有被回滾,select error_number語句也沒有執行。改變SQL Server事務中的表

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 

回答

3

而不是使用事務,並希望嘗試捕捉到工作中,更好的替代方法是檢查是否在表中存在的列,如果沒有,則使用alter查詢下面給出 -

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

begin 

-- Your alter statement 

end 
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