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

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

另外:将您的COMMIT TRANSACTION语句放在ALTER TABLE命令之后 - 毕竟,如果确实出现问题 - 代码执行将立即跳转到 catch 块,因此只有在一切正常时才会执行该行

于 2012-05-17T14:51:31.113 回答
0

你不应该有,Go因为它表示批处理的结束,并且你的提交应该在 alter table 之后。

也没有必要检查一个事务是否正在运行,因为在这种情况下,它总是有

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 回答