#sql #sql-server #ssms
#sql #sql-сервер #ssms
Вопрос:
Мне нужно знать, правильно ли указан приведенный ниже sql, чтобы выполнить откат, если произойдет что-то плохое.
Сначала я создаю временную таблицу
IF OBJECT_ID(N'tempdb..#LocalSummery') IS NOT NULL
DROP TABLE #LocalSummery
CREATE TABLE #LocalSummery (
затем я заполняю таблицу
insert into #LocalSummery'
SELECT *....
затем я запускаю try catch
BEGIN TRY
BEGIN TRANSACTION
delete from LocalSummeryRealTable
INSERT INTO LocalSummeryRealTable
SELECT S.*
FROM #LocalSummery' AS S
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
...
Я заметил, что когда я вставлял в LocalSummeryRealTable, поля не выстраивались в линию, и я получил сообщение об ошибке. Я ожидал отката, но в окне запроса SSMS он выдал мне сообщение о том, что транзакция не была зафиксирована, и спросил меня, хочу ли я ее зафиксировать. Почему это должно спросить меня, когда оно должно быть откатано?
Комментарии:
1. Ваш коммит не должен быть, если @@tranccount не равен> 0.
2. Также какова цель, если try catch, если вы используете транзакции…. Я на самом деле задаю этот вопрос для моей собственной информации.
3. @logixologist
BEGIN TRANSACTION
увеличивается@@TRANCOUNT
на 1, поэтому приCOMMIT
попадании в синтаксис выше, это будет1
. Я считаю, что логика попытки OP такова: «Попробуйте следующее… если мы добираемся до последней строки без ошибок, тогда мы фиксируем. Если есть ошибка, отправьте нас в раздел CATCH. Если мы начали транзакцию, откатите ее «.4. Я всегда выполнял откат, если @@error> 0.
5. @Santi это вообще необходимо?