Лучший способ работы с транзакциями в MS SQL Server Management Studio
Скажем, у меня есть оператор SQL, который синтаксически и семантически корректен, чтобы он выполнялся.
В Management Studio (или любом другом инструменте запросов), как я могу проверить SQL-запросы, и если я заметил, что они что-то сломали, откат (в отдельном запросе?)
Ответы
Ответ 1
Самое сложное, что нужно сделать, это обернуть свой код в транзакцию, а затем выполнить каждую партию кода T-SQL по строкам.
Например,
Begin Transaction
-Do some T-SQL queries here.
Rollback transaction -- OR commit transaction
Если вы хотите включить обработку ошибок, вы можете сделать это, используя TRY... CATCH BLOCK. В случае возникновения ошибки вы можете отменить трансляцию в блоке 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
Надеюсь, это поможет, но, пожалуйста, дайте мне знать, если вам нужно больше деталей.
Ответ 2
Я хочу добавить точку, которую вы также можете (и должен, если то, что вы пишете, сложно) добавьте тестовую переменную для отката, если вы находитесь в тестовом режиме. Затем вы можете выполнить все это сразу. Часто я также добавляю код, чтобы видеть результаты до и после различных операций, особенно если это сложный script.
Пример ниже:
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