SQLステートメントがラップされる理由sp_executesql
は、SqlCommand.Commandtype
プロパティの設定とパラメーターをコマンドに渡すことです。
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
上記のコードは、次のT-SQLで終了します。
exec proc1 @param1=1
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
このコードは、次のT-SQLの実行で終了します。
exec sp_executesql N'proc1',N'@param1 int',@param1=1
追加23.12.15:CommandType.Text
コマンドを使用した場合の結果は同様です。パラメーターがコマンドオブジェクトに追加されるとすぐに、.NETはクエリ全体をラップしsp_executesql
てパラメーターをパラメーターに渡します。
追加:を深く掘り下げた後sp_executesql
、パラメーターのスニッフィングとプランのキャッシュにより、.NETクラスのこの動作は、頻繁なクエリのコンパイルとプランの数を回避するために完全に意味があります。したがって、基本的には、SQL Serverのパフォーマンスを全般的に向上させるように設計されていますが、同時に、最初に作成されたクエリプランとは異なるパラメーター値で使用される一部のクエリ(パラメータースニッフィングの問題)のパフォーマンスが低下する可能性があります。
見る:
上記のサンプルは、.NET Framework 4.5およびSQL Server 2008 Developer Editionを使用して作成されました。