否则声明错误或交易效果?

时间:2010-10-01 09:59:27

标签: sql-server transactions printing

我在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的替代方案,但我想了解这个奇怪的案例......

谢谢!

2 个答案:

答案 0 :(得分:1)

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

SELECT @@TRANCOUNT

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

答案 1 :(得分:0)

我不能具体说明为什么你的问题正在发生。就个人而言,我不确定我是否会使用事务和错误处理或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