我在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 :(得分: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