0

私は次のT-SQLを持っています:

USE [MYDB]
GO
SET XACT_ABORT, NOCOUNT ON
GO
BEGIN TRANSACTION;
BEGIN TRY
        ALTER TABLE [dbo].[ContactRole] 
        DROP CONSTRAINT [FK_8bff7074914bc29885004c0a323] 
        GO
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
        ROLLBACK TRANSACTION;
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;

これにより、解析時にこのエラーが発生します。

メッセージ102、レベル15、状態1、行9
「FK_8bff7074914bc29885004c0a323」の近くの構文が正しくありません。

単独の場合、またはトランザクション内だけの場合、解析エラーは発生しません。

4

2 に答える 2

1

行のGO後にドロップALTER TABLE ... DROP CONSTRAINT ..

....
BEGIN TRANSACTION;
BEGIN TRY
    ALTER TABLE [dbo].[ContactRole] 
    DROP CONSTRAINT [FK_8bff7074914bc29885004c0a323] 

    COMMIT TRANSACTION;
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
        ROLLBACK TRANSACTION;
END CATCH

GOはSQLキーワードではありません。これは、SQL ServerManagementStudioによって「バッチセパレータ」としてのみ理解されます。

COMMIT TRANSACTIONまた、コマンドの直後にステートメントを配置しますALTER TABLE-結局のところ、何かがうまくいかない場合-コードの実行はすぐにcatchブロックにジャンプするので、すべてがうまくいった場合にのみ行が実行されます

于 2012-05-17T14:51:31.113 に答える
0

Goバッチの終了を示しており、コミットは変更テーブルの直後にある必要があるため、持ってはいけません。

また、トランザクションがキャッチで実行されているかどうかを確認する必要はありません。この状況では、トランザクションが常に実行されているためです。

USE [MYDB]
GO
SET XACT_ABORT, NOCOUNT ON
GO
BEGIN TRANSACTION;
BEGIN TRY
        ALTER TABLE [dbo].[ContactRole] 
        DROP CONSTRAINT [FK_8bff7074914bc29885004c0a323] 

        COMMIT TRANSACTION; 
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;

        ROLLBACK TRANSACTION;
END CATCH
于 2012-05-17T14:58:32.003 に答える