2011-02-14 33 views
1

我爲這個愚蠢的問題提前道歉,但我不明白爲什麼CREATE TABLE不會回滾到下面顯示的代碼中。我知道在用戶定義的事務中不能指定CREATE DATABASE,CREATE FULLTEXT CATALOG,CREATE FULLTEXT INDEX。請注意SSMS中的Tables文件夾在執行此代碼時被鎖定。爲什麼CREATE TABLE命令在用戶定義的事務中不起作用?

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

它給你什麼錯誤? – 2011-02-14 17:25:03

+2

從我所看到的,這個腳本甚至不應該開始。您在不使用GROUP BY的情況下混合聚集和非聚合列,因此在腳本運行之前您應該收到錯誤消息。 – 2011-02-14 17:25:35

+0

消息8120,級別16,狀態1,行7 列'temp.chisla'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 – 2011-02-14 18:25:35

回答

3

你沒有告訴它回滾。 JNK展示瞭如何在出現可捕獲錯誤的情況下嘗試Catch shoudl來回滾交易。但是,在這種情況下,使用不正確的SQL,它不會在任何情況下回滾,因爲它是一個不可捕獲的錯誤。 SQl中必須有正確的語法才能正確工作,這是動態SQl非常危險的一個原因,因爲它不可能完全測試。

無論如何,這是一個不錯的做法,即時創建表。如果臨時需要某些內容,請使用臨時表或表變量,不要創建一個永久表,如果該操作失敗,則希望該永久表回滾創建。

0

我想你想要一個TRY...CATCH塊。有一個非常好的解釋here on msdn.

對於一個簡單的例子,雖然:

BEGIN TRY 
    BEGIN TRANSACTION 
    ...your code... 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ...error reporting code here... 
    ROLLBACK TRANSACTION 
END CATCH; 
相關問題