Почему команда CREATE TABLE не работает в пользовательской транзакции?

Я заранее извиняюсь за этот глупый вопрос, но не могу понять, почему CREATE TABLE не откатывается в коде, показанном ниже. Я знаю, что CREATE DATABASE, CREATE FULLTEXT CATALOGUE, CREATE FULLTEXT INDEX не может быть указан witnin пользовательской транзакции. Обратите внимание, что папка 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 

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

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

Я думаю, вам нужен блок TRY...CATCH . В msdn есть очень приятное объяснение .

Для быстрого примера:

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

Лучший способ программирования ночной передачи данных, столбец идентификации,

Могу ли я планировать задание для работы в полночь каждого часового пояса и как позволить proc знать, какой часовой пояс обрабатывать?

RAISERROR повышает ошибку параметра замены

Я не хочу, чтобы мой объект знал о моем бизнес-слое – так, как его загрузить?

SQL для исключения праздников, выходных и будущих дней

Правило строки, такое как запрос базы данных столбцов

Как перевести вложенный оператор CASE в предложение WHERE

Как подсчитать или суммировать значения столбцов String

SQL Query – множественные объединения возвращаются как столбцы

Пользовательские разделенные имена столбцов электронной почты в несколько столбцов в SQL

Хороший способ одновременного вызова нескольких агентств SQL Server из одной основной работы?

TSQL – сравнение даты выполнения для «дубликатов» / ложных срабатываний при первоначальном запросе?

Как получить последнее время вставки / обновления / удаления datetime на Sql Server 2005?

PDO dblib получить результат из хранимой процедуры

Как перебирать каждую строку в таблице и обновлять столбец?

Давайте будем гением компьютера.