Почему команда CREATE TABLE не работает в пользовательской транзакции? - PullRequest
1 голос
/ 14 февраля 2011

Я заранее прошу прощения за этот глупый вопрос, но не могу понять, почему CREATE TABLE не откатывается в коде, показанном ниже.Я знаю, что CREATE DATABASE, CREATE FULLTEXT CATALOG, CREATE FULLTEXT INDEX не могут быть указаны в пользовательской транзакции.Обратите внимание, что папка Tables в SSMS блокируется во время выполнения этого кода.

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 ]

3 голосов
/ 15 февраля 2011

Вы не сказали откат. JNK показывает, как выполнить попытку Catch для отката транзакции в случае обнаруживаемой ошибки. Однако в этом случае с неправильным SQL, он не будет откатывать в любом случае, потому что это ошибка, которую нельзя отследить. У вас должен быть правильный синтаксис в SQl, чтобы транзакции работали правильно, и это одна из причин, по которой динамический SQl может быть очень опасным, поскольку невозможно полностью протестировать.

В любом случае, создавать таблицы на лету - это плохая практика. Если вы хотите что-то временно, используйте временную таблицу или переменную таблицы, не создавайте постоянную таблицу, от которой вы ожидаете откат создания, если действие не выполнено.

0 голосов
/ 14 февраля 2011

Я думаю, что вы хотите TRY...CATCH Блок.Здесь очень хорошее объяснение здесь, на MSDN.

Для краткого примера:

BEGIN TRY
   BEGIN TRANSACTION
   ...your code...
   COMMIT TRANSACTION
END TRY
BEGIN CATCH
   ...error reporting code here...
   ROLLBACK TRANSACTION
END CATCH;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...