構文的にも意味的にも正しいSQLステートメントがあり、実行されるとします。
Management Studio(または他のクエリツール)でSQLステートメントをテストするにはどうすればよいですか。何かが壊れていることに気付いたら、ロールバック(別のクエリで?)
最も簡単なことは、コードをトランザクションにラップし、T-SQLコードの各バッチを1行ずつ実行することです。
例えば、
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
これがお役に立てば幸いですが、詳細が必要な場合はお知らせください。
テストモードの場合、ロールバックにテスト変数を追加することもできます(また、作成している内容が複雑な場合は追加する必要があります)。その後、すべてを一度に実行できます。多くの場合、特に複雑なスクリプトの場合、さまざまな操作の前後の結果を確認するコードも追加します。
以下の例:
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