2011-07-22 1 views
4

ストアドプロシージャ内のENDの後のステートメントは実行されていますか?ストアドプロシージャのENDの後のステートメントは実行されていますか?

私のストアドプロシージャには、BEGIN/ENDブロックの後のドロッププロシージャが含まれていることがわかりました。ただし、コード内の別の場所でストアドプロシージャを実行するたびに正常に動作し、 pvd_sp_yyyは削除されません。なぜわからないのですか?私はこれについて最初に心配しているので、私は関係なく、追加の声明を削除するつもりです。

誰もがこれについてアイデアを持っていますか?

おかげ

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 


ALTER PROCEDURE [dbo].[pvd_xxx] 
    @var 
AS 

BEGIN 

    DECLARE @RETURN int 

    SET @RETURN = 0 

    IF EXISTS (
     SELECT * FROM table1 
     WHERE name = @var 
    ) 
    BEGIN 
     SET @RETURN = 1 
    END 

    RETURN @RETURN 

END 


IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pvd_sp_yyy]') AND type in (N'P', N'PC')) 
    DROP PROCEDURE [pvd_sp_yyy] 
+0

私はドロッププロシージャー・ステートメントを含めるにはしたくありません。これは間違いですので、私はそれを削除します。私はそれが全く実行されるかどうかを明確にしたいと思います。他はそれを示すかもしれないと思われる?? 2.また、同じミスをしないように、ENDの後に必ずGOを入れるべきですか? – bobbo

+0

私は興味をそそられています - なぜ2番目のprocが落とされていないのか分かりましたか? (あなたのコードが書かれている方法、 'IF EXISTS ... DROP ...'コードはすべての実行時に必ず呼び出されます...) – Tao

答えて

7

BEGIN/ENDはストアドプロシージャの制限ではありません。バッチの終わり(通常GO)です。

はい、コードが実行されます。

これは、BEGIN/ENDが不要であることを意味します。パラメータの前後にかっこがあります。これは高水準のクライアント言語ではなくSQLです。

私はかなり頻繁にストアドプロシージャ内でEXECUTE GRANTを残してきた... :)

+0

私はドロッププロシージャ文をインクルードしたくありません。これは間違いですので、私はそれを削除します。私はそれが全く実行されるかどうかを明確にしたいと思います。あなたはそれを示唆しているようですね?? 2.また、同じミスをしないように、ENDの後に必ずGOを入れるべきですか? – bobbo

+0

@bobbo:​​うん、GOを使う。 – gbn

0

あなたが実際にDROP PROCEDUREが、それはバッチ内の唯一のステートメントで、そうGOであなたのALTER PROCEDUREDROP PROCEDUREを分離する必要がその後、実行したい場合。

2

はい、あなたが宣言したのはすべてコードブロックです。プロシージャの内容は、GOを配置してバッチを実行するまで終了しません。

関連する問題