我提前为这个愚蠢的问题道歉,但我无法理解为什么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
答案 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;