Лучший способ работы с транзакциями в среде MS SQL Server Management Studio
допустим, у меня есть оператор SQL, который синтаксически и семантически корректен, поэтому он выполняется.
В Management Studio (или любом другом инструменте запроса) как я могу проверить операторы SQL, и если я замечаю, что они что-то сломали, откат (в отдельном запросе?)
2 ответа:
самое простое, что нужно сделать, это обернуть ваш код в транзакцию, а затем выполнить каждую партию кода T-SQL строка за строкой.
например,
Begin Transaction -Do some T-SQL queries here. Rollback transaction -- OR commit transaction
Если вы хотите включить обработку ошибок, вы можете сделать это с помощью TRY...БЛОК CATCH. В случае возникновения ошибки вы можете откатить транаскцию в блоке catch.
например:
USE AdventureWorks; GO BEGIN TRANSACTION; BEGIN TRY -- Generate a constraint violation error. DELETE FROM Production.Product WHERE ProductID = 980; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; END CATCH; IF @@TRANCOUNT > 0 COMMIT TRANSACTION; GO
см. следующую ссылку для более подробности.
http://msdn.microsoft.com/en-us/library/ms175976.aspx
надеюсь, что это поможет, но, пожалуйста, дайте мне знать, если вам нужно больше деталей.
Я хочу добавить точку, которую вы также можете (и должны, если то, что вы пишете, сложно) добавить тестовую переменную для отката, если вы находитесь в тестовом режиме. Затем вы можете выполнить все это сразу. Часто я добавить код, чтобы увидеть до и после результатов различных операций, особенно если это сложный сценарий.
пример:
USE AdventureWorks; GO DECLARE @TEST INT = 1--1 is test mode, use zero when you are ready to execute BEGIN TRANSACTION; BEGIN TRY IF @TEST= 1 BEGIN SELECT *FROM Production.Product WHERE ProductID = 980; END -- Generate a constraint violation error. DELETE FROM Production.Product WHERE ProductID = 980; IF @TEST= 1 BEGIN SELECT *FROM Production.Product WHERE ProductID = 980; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; END END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; END CATCH; IF @@TRANCOUNT > 0 AND @TEST = 0 COMMIT TRANSACTION; GO