구문 상 및 의미 상 올바른 SQL 문이있어 실행된다고 가정 해 보겠습니다.
Management Studio (또는 기타 쿼리 도구)에서 SQL 문을 테스트하려면 어떻게해야하며, SQL 문이 손상되었음을 발견하면 롤백 (별도의 쿼리에서?)
답변
가장 쉬운 방법은 트랜잭션에서 코드를 래핑 한 다음 T-SQL 코드의 각 배치를 한 줄씩 실행하는 것입니다.
예를 들면
Begin Transaction
-Do some T-SQL queries here.
Rollback transaction -- OR commit transaction
오류 처리를 통합하려면 TRY … CATCH BLOCK을 사용하면됩니다. 오류가 발생하면 catch 블록 내에서 tranasction을 롤백 할 수 있습니다.
예를 들면 :
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