VSS にあるストアド プロシージャを実行する展開パッケージを作成しています。私はこれを行うことができますが、私の問題はこれです。展開する必要があるデータベースは 30 程度ありますが、更新を取得する必要のないデータベースは 2 つしかありません。それで、バッチ ファイルが実行する .sql ファイルに次のコードを含めました。
IF OBJECT_ID('CONFIG') IS NULL OR DB_NAME() LIKE '%SampleDB%'
BEGIN
PRINT 'This is not a store database. Skipping this database.'
SET NOEXEC ON
RETURN
END
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = OBJECT_ID(N'[dbo].[sp_ThisIsMySampleProcedure]'))
DROP PROCEDURE [dbo].[sp_ThisIsMySampleProcedure]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[sp_ThisIsMySampleProcedure]
-- Everything else follows...
この SQL コードは、SQL Server 上で完全に実行されます。サンプル DB に対して実行するたびに、プロシージャが存在するかどうかのチェックとその後のすべてのチェックに進むことを自動的にスキップします。
しかし、バッチ ファイルを使用して SampleDB に対して実行しようとすると、エラー メッセージが表示されますが、RETURN
キーワードを無視して手順を実行し続けます。したがって、メッセージは次のようになります。
これは店舗データベースではありません。このデータベースをスキップします。
メッセージ 3701、レベル 11、状態 5、行 8
プロシージャ 'sp_ThisIsMySampleProcedure' を削除できません。存在しないか、アクセス許可がないためです。
この手順は SampleDB に実際には存在しないため、エラー メッセージが正しいことは理解しています。RETURN
しかし、スクリプト全体の実行をスキップする条件を満たした後、そこにキーワードがあるのに、なぜまだ実行し続けるのでしょうか?
ありがとうございました!
編集:
わかりました、人々は私を完全には理解していないと思います。これがシナリオです。私の手順 (上記を参照) は、SQL Server Management Studio でうまく機能します。つまり、SampleDB で実行しようとすると、メッセージが表示されるということです。This is not a store database. Skipping this database.
しかし、このストアド プロシージャを実行するバッチ ファイルを実行しようとすると、コマンド プロンプトに次のメッセージが表示されます。
これは店舗データベースではありません。このデータベースをスキップします。
メッセージ 3701、レベル 11、状態 5、行 8
プロシージャ 'sp_ThisIsMySampleProcedure' を削除できません。存在しないか、アクセス許可がないためです。
これは基本的に、最初の条件が満たされたにもかかわらず、バッチ ファイルが SQL スクリプト全体を実行し続けたことを意味します。
私の質問は、SQL Server がメッセージをスローするたびにThis is not a store database. Skipping this database.
、バッチ ファイルがすぐに SQL ファイルの実行を停止することをバッチ ファイルに知らせる方法です。