Я научился использовать Try ... Catch and Transactions в SQL и им пытаюсь проверить это на некоторых данных, которые у меня есть. Из того, что я узнал, если одно выполнение завершилось неудачно, тогда улов должен откат всей партии, поэтому ни одна из таблиц в секции TRY не должна обновляться, ОДНАКО, когда я запустил это, он выкинет ошибку для таблицы @b в блок поймать, но он все равно будет вставлять значения для таблицы @aSQL-транзакция в try ... catch не будет откатываться
SET XACT_ABORT ON;
Begin Try
Begin Transaction s1
Insert Into @a
Values(@CountryId,@Country,@CountryCode,@DisplayImage,0,@ContinentCode,40)
Insert Into @b
Values('xxxxx',@ContinentCode,@Continent,0) --ERROR
Commit Transaction
End Try
Begin Catch
Select ERROR_NUMBER(),ERROR_MESSAGE()
Rollback Transaction s1
End Catch
select * from @a
select * from @b
Загвоздка работает блок, и я вижу eRROR_NUMBER и error_message, но не первая вставка получить откат?
Второй комментарий Amirreza. У вас также есть SET XACT_ABORT. В любом случае это должно отбросить транзакцию: вы можете отключить его, чтобы ваш код действительно делал что-то. –
Я хочу указать на то, что переменные таблицы не откатываются, так как это означает, что вы можете использовать их для хранения информации, которую вы можете поместить в таблицу исключений после откат. – HLGEM
@HLGEM: Да, это преимущество табличных переменных в этом случае вы упомянули. –