2012-02-28 17 views
-2

何が起こっているのかはかなり確信していますが、仲間のSQL Server Travelerからいくつかのアイデアを得たいと思っています(実際には何が起こっているのかははっきりしていますが、興味深い議論ができると思います)。BEGINとENDはありませんか?

私はこのバットマンを熟考してください...これで何が起こっていますか?

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 

どうしますか?私の最初の考えは、手続きが作成されてすぐに削除されたことです。 Wrongo!そしてあなたはおそらく以前からの問題についてこれを知っていなければ同じと思っていたでしょう...認めてください!

SSMSでは、クエリ結果をテキストに切り替えるためにCtrl-Tを押します。その後、実行、次の(またはスクリプト新しい手順ToBeDroppedができます):

EXECUTE ToBeDropped; 

再実行スクリプトに上記sys.sql_modulesクエリまたは試み対象:

SELECT m.[definition] 
FROM sys.sql_modules AS m INNER JOIN sys.objects AS obj 
ON m.object_id = obj.object_id 
WHERE obj.name = 'ToBeDropped'; 

次の手順を実行します。それはもはや存在しないのでできません。

うーん...ここで何が起こっているの?明らかに暗黙のは、BEGIN、しばらくの手順に終止符があり、次のように:私は暗黙の行動の大ファンではない

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
    BEGIN 
     PRINT 'Drop me!'; 
    END 

    DROP PROCEDURE ToBeDropped; 
END ; 

:以下のような優れたルックスをフォーマットし

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 
END; 

。私は明白であることを好む。 TSQLは、より現実的になる方向に向かっています。セミコロンとすべてのCLR機能が現在利用可能であるか、TSQLで利用可能な可能性があります。少なくとも1つのBEGINとENDのペアを持つ必要があるCREATE PROCEDURE本体が必要です - BEGINのエイリアス/シノニムとENDのエイリアス/シノニムです - 私たちはTSQLの変換に一歩近づくでしょうC#に変換します。

思考?意見ですか?ありがとう!

+0

これはディスカッションサイトではありません。これはQ&Aサイトです。 http://stackoverflow.com/faq#dontask –

+0

を参照してください。この質問は、http://blog.stackoverflow.com/2011/07/itsの観点から書き直すと「十分に残っている」可能性があります。 -ok-to-ask-and-answer-your-own-questions/ – sarnold

答えて

2

ドロップ手順は、PROCの一部であり、あなたはあなたがいない場合、これは、バッチターミネータであるGOに気づく、これは、PROCを作成し、ドロップします

PROCを呼び出すまでprocがドロップされ得ることはありませんあなたがこれを行うとき、ドロップステートメントがPROC自体

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
GO 
DROP PROCEDURE ToBeDropped; 

の一部になります

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 

procが作成されますが、ドロップされないことを持っていますPEDあなたはPROCを呼び出すまで

EXEC ToBeDropped 

これは、BEGINとは何の関係もありませんが、DROPのPROCは手順自体の一部であり、実行されませんので、あなたがxeecuteしようとすると、それ

を呼び出すまでprocが再び

EXEC ToBeDropped 

は、次のようなメッセージが表示されます

Msg 2812, Level 16, State 62, Line 1 
Could not find stored procedure 'ToBeDropped'. 
0

これは、あいまいさのために閉鎖される可能性が高い、むしろ未解決の問題です。あなたはMeta Overflowで再度聞くことができますか?

しかし、シャットダウンする前に、私が知っている限り、推論はBEGINとENDのためではありません。それはGOのためです。作成プロシージャは、ファイルまたはGOの最後に当たるまで、すべてのロジックをその下に置きます。したがって、これはあなたが探している明白な価値です:

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
    PRINT 'Drop me!'; 
END 
--Completes the procedure creation 
GO 
DROP PROCEDURE ToBeDropped; 
+0

この質問はMetaのdownvotesの雹の中で閉じられるでしょう。 Metaはネットワーク、バグレポート、提案、ユーザーサポートに関する質問です。 – sarnold

関連する問題