2009-05-07 6 views
13

SQLスキーマ作成スクリプトを手動で生成するときは、通常は「プロシージャの作成...」を呼び出しますが、タスク/スクリプトの生成オプションを使用してスクリプトを生成すると、 'spexecutesql @statement = ..'が使用されます。なぜSQL Serverは文字列を含むsp_executesql文を使用してストアドプロシージャを生成しますか?

EXEC dbo.sp_executesql @statement = N'-- ============================================= 
    -- Author:  Me 
    -- Create date: 20/03/2009 
    -- Description: Does stuff 
    -- ============================================= 
    CREATE PROCEDURE [dbo].[MyProc] 
     -- Add the parameters for the stored procedure here 
     @StartDate datetime 
    AS 
    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 
    ... 
END 
' 

なぜですか?コメントを残すことは何か? ありがとう

答えて

18

コメントとは関係ありません。これは、「存在しない場合は含める」ように指示した場合にのみ、そのようにします。その理由は、オブジェクトが動的に実行される場合にのみ、オブジェクトをプログラムで含めるか除外することができるからです。

これは、オプション\ SQL Serverオブジェクトエクスプローラ\スクリプト - オブジェクトの存在を確認することで "False"を選択することで、ストアドプロシージャを無効にすることができます。

+4

私はそれが本当であるかどうかはわかりません。私はしばしば "IF NOT EXISTS"型警備員を書いて、sp_executesqlを使ってスクリプトを実行しないでください。 –

+0

私はかなりアプローチがアルターにはうまくいかず、ストアドプロシージャに関連して作成すると確信しています –

0

私は、GOなしで同じスクリプトファイルに複数のsprocsを作成できることが関係していると思いますか? sprocを直接作成する場合は、バッチで完了する必要があります(GOで終了します)。 sp_executesqlを使用すると、オブジェクト間で生成されたスクリプトを実行する必要はありません。私は覚えていませんが、おそらくそこには何かがあります。(私の前にDBはありません)。

0

spexecutesqlを使用するのがベストプラクティスです。変数のスコープを分離/制限することでSQLインジェクションなどを防止する必要があります。ここではhttp://msdn.microsoft.com/en-us/library/ms188001.aspx

spexecutesql-EXECも使用しないでくださいプレーンな古いEXEC - それはちょうど安全ではない。

2

これは古いですが、修正はSql 2012のかなり深いところに埋め込まれています。オプションでObject Existence Checksが必要なときに、Sprocsをレンダリングする方法が正しくあります。これを変更するには、[オプション]、[SQL Serverオブジェクトエクスプローラ]、[スクリプト]、[オブジェクトスクリプトオプション]に移動し、[オブジェクトの存在を確認]をfalseに設定します。 sprocsは、sp_executesqlを使用せずに、通常は「通常」レンダリングします。

2

のSQL Server 2012、=>オプションツールを設定=> SQL Serverのオブジェクト=>スクリプトを探検、チェック対象の存在= falseを

は、この問題を解決することができます。

+0

はい!これはSSMS 2012のソリューションです – nano

関連する問題