【问题标题】:Else statement bug or transaction effect?其他语句错误或交易效果?
【发布时间】:2010-10-01 20:51:29
【问题描述】:

我在 sql server 2005 中使用以下代码。

BEGIN TRANSACTION;
CREATE TABLE dbo.MyTable
(
 idLang int NOT NULL IDENTITY (1, 1),
 codeLang nvarchar(4) NOT NULL
)  ON [PRIMARY];

IF @@ERROR = 0
 BEGIN
  PRINT 'before_commit';
  COMMIT TRANSACTION;
  PRINT 'after_commit';
 END
ELSE
 BEGIN
  PRINT 'before_rollback';
  ROLLBACK TRANSACTION;
  PRINT 'after_rollback';
 END
GO

1 - MyTable 不存在时显示(无错误情况):
before_commit
after_commit

=> 好的

2 - MyTable 存在时显示(错误情况):
'数据库中已经有一个名为'MyTable'的对象。'

=> 为什么没有执行“else”语句? (不打印,不回滚)

我知道 try-catch 的替代方法,但我想了解这个奇怪的情况......

谢谢!

【问题讨论】:

    标签: sql-server transactions printing


    【解决方案1】:

    在查询编译期间将检查 CREATE TABLE 并失败,因此不会执行批处理中的任何代码。尝试添加:

    SELECT @@TRANCOUNT
    

    到脚本的末尾(即在 GO 之后),您会看到 BEGIN TRANSACTION 也从未发生过。

    【讨论】:

      【解决方案2】:

      我无法具体说明您的问题发生的原因。就个人而言,我不确定我会使用事务和错误处理或 try/catch 块来执行此操作。

      您是否尝试过查询sys.tables 表来检查它是否存在。类似的东西:

      IF EXISTS(SELECT * FROM sys.tables WHERE object_id = object_id('MyTable'))
      BEGIN
       print 'table already exists'
      END
      ELSE
      BEGIN
          CREATE TABLE dbo.MyTable
          (
              idLang int NOT NULL IDENTITY (1, 1),
              codeLang nvarchar(4) NOT NULL
          )  ON [PRIMARY];
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多