为什么CREATE TABLE命令不能在用户定义的事务中工作?

时间:2011-02-14 17:18:17

标签: sql sql-server sql-server-2008

我提前为这个愚蠢的问题道歉,但我无法理解为什么CREATE TABLE没有在下面显示的代码中回滚。我知道无法在用户定义的事务中指定CREATE DATABASE,CREATE FULLTEXT CATALOG,CREATE FULLTEXT INDEX。请注意,SSMS中的Tables文件夹在执行此代码时会被锁定。

BEGIN TRANSACTION T1
CREATE TABLE temp
(
chisla char(1)
)

SELECT count(chisla) AS Count, chisla AS My_Numbers
FROM temp
--GROUP BY chisla
ORDER BY chisla

drop table temp
COMMIT TRANSACTION T1
GO

2 个答案:

答案 0 :(得分:3)

你没有告诉它回滚。 JNK展示了如何在可捕获错误的情况下尝试Catch shoudl来回滚事务。但是在这种情况下SQL不正确,它不会在任何情况下回滚,因为它是一个不可捕获的错误。您必须在SQl中具有正确的语法才能使事务正常工作,这是动态SQl非常危险的一个原因,因为无法完全测试。

无论如何要像这样动态创建表是一种不好的做法。如果你想要一些临时的东西,使用临时表或表变量,不要创建一个永久表,如果操作失败,你希望回滚创建。

答案 1 :(得分:0)

我想你想要一个TRY...CATCH Block。有一个很好的解释here on msdn.

快速举例说明:

BEGIN TRY
   BEGIN TRANSACTION
   ...your code...
   COMMIT TRANSACTION
END TRY
BEGIN CATCH
   ...error reporting code here...
   ROLLBACK TRANSACTION
END CATCH;