Sql server 2008 TRY/CATCH中包含DROP约束的语法错误

Sql server 2008 TRY/CATCH中包含DROP约束的语法错误,sql-server-2008,tsql,Sql Server 2008,Tsql,我有以下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() A

我有以下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行
“FK8BUFF7074914BC29885004C0A323”附近的语法不正确


单独或仅在事务中时,没有解析错误。

转到
更改表后。。。下拉约束..

....
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 Server Management Studio理解为“批处理分隔符”


另外:将您的
COMMIT TRANSACTION
语句放在
ALTER TABLE
命令的后面-毕竟,如果出现问题,代码执行将立即跳入catch块,因此,该行仅在一切正常时执行

您不应该使用
Go,因为它指示批处理的结束,并且您的提交应该在alter表之后

此外,也不需要检查事务是否在catch上运行,因为在这种情况下,它将始终具有

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