25

統合戦略の一環として、データベースを更新するために実行する SQL スクリプトがいくつかあります。これらすべてのスクリプトが最初に行うことは、実行する必要があるかどうかを確認することです。たとえば、次のようになります。

if @version <> @expects
    begin
        declare @error varchar(100);
        set @error = 'Invalid version. Your version is ' + convert(varchar, @version) + '. This script expects version ' + convert(varchar, @expects) + '.';
        raiserror(@error, 10, 1);
    end
else
    begin
        ...sql statements here...
    end

よく働く!ストアド プロシージャを追加する必要がある場合を除きます。「create proc」コマンドは、SQL コマンドのバッチ内の唯一のコマンドである必要があります。IF ステートメントに「create proc」を入れると、次のエラーが発生します。

'CREATE/ALTER PROCEDURE' は、クエリ バッチの最初のステートメントである必要があります。

痛い!スクリプトに CREATE PROC コマンドを追加し、必要な場合にのみ実行するにはどうすればよいですか?

4

11 に答える 11

25

これが私が思いついたものです:

次のように、EXEC() でラップします。

if @version <> @expects
    begin
        ...snip...
    end
else
    begin
        exec('CREATE PROC MyProc AS SELECT ''Victory!''');
    end

魔法のように動作します!

于 2008-09-11T00:16:51.100 に答える
5

ただし、ストアド プロシージャ内の単一引用符に注意してください。2 つ目の引用符を追加して「エスケープ」する必要があります。最初の答えはこれを行いましたが、見逃した場合に備えて。若手選手の罠。

于 2008-09-11T03:40:40.767 に答える
3

データベースのバージョン管理は進むべき道ですが...なぜ条件付きでストアド プロシージャを作成するのでしょうか。ビュー、ストアド プロシージャ、関数については、条件付きで削除し、毎回再作成します。条件付きで作成する場合、2 年前に別の開発者 (あなたまたは私は決してこれを行うことはありません) が 1 回削除することを忘れないだろうと確信していた問題またはハッキングがあるデータベースをクリーンアップすることはありません。緊急アップデート。

于 2008-09-11T04:26:41.700 に答える
2

これは古いスレッドですが、Jobo は正しくありません。Create Procedure はバッチの最初のステートメントである必要があります。Existsしたがって、 を使用して存在をテストしてから、Createまたはを使用することはできませんAlter。残念。

于 2012-02-21T18:49:23.970 に答える
2

削除と作成の問題は、削除されるオブジェクトに以前に適用されていたセキュリティ許可が失われることです。

于 2008-12-08T16:15:35.400 に答える
1

私は認めなければなりません、私は通常@Peterに同意します-私は条件付きでドロップし、無条件に毎回再作成します。バージョン管理の有無にかかわらず、データベース間のスキーマの違いを推測しようとしたときに、私は過去に何度も指摘されてきました。

そうは言っても、あなた自身の提案@Joshはかなりクールです。確かに興味深い。:-)

于 2008-09-11T08:15:15.130 に答える
0
IF NOT EXISTS(SELECT * FROM sys.procedures WHERE name = 'pr_MyStoredProc')
BEGIN

     CREATE PROCEDURE pr_MyStoredProc AS .....
     SET NOCOUNT ON
END

ALTER PROC pr_MyStoredProc
AS
SELECT * FROM tb_MyTable
于 2009-01-14T05:03:37.227 に答える
0

T-SQL で「Exists」コマンドを使用して、ストアド プロシージャが存在するかどうかを確認します。存在する場合は「Alter」を使用し、そうでない場合は「Create」を使用します

于 2009-01-14T05:05:36.693 に答える