2010-10-01 38 views
1

我使用下面的代码在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的选择,但我想了解这个陌生的情况下...

谢谢!

回答

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 
1

的CREATE TABLE将查询编译和失败的过程中进行检查,所以将不执行批处理代码。尝试添加:

SELECT @@TRANCOUNT 

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