sp_executesqlをデフォルトで設定/使用できますか?


10

SQL Serverに対して非常に動的なSQLクエリを使用するアプリケーションを探しています。非常に奇妙で複雑な方法で作成されたクエリを見て、それは別の話ですが、私が自分で物事を見つけることができない(あまりにも愚かすぎる)ことの正当な理由を与えるように言います...わかりませんクエリがでラップされているコードsp_executesql

しかし、トレースすると、多数のクエリがでラップされて表示されsp_executesqlます。アプリケーションソリューション全体には、コマンドもまったく含まれていませんsp_executesql

だから、デフォルトでsp_executesqlを使用してクエリをラップするようソフトウェアに強制する、まだ知らない種類の構成があるのか​​どうか疑問に思いました。

何がこの動作を引き起こす可能性がありますか?

回答:


11

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を使用して作成されました。


5

これが.NETアプリケーションの場合、SqlCommand.ExecuteReader()が呼び出された結果である可能性が非常に高いです。メインのSqlCommandクラスページによると、「解説」セクションのメソッドの説明のグリッドで、ExecuteReaderの下に次のように記載されています。

行を返すコマンドを実行します。パフォーマンスを向上させるために、ExecuteReaderは、Transact-SQL sp_executesqlシステムストアドプロシージャを使用してコマンドを呼び出します。したがって、ExecuteReaderは、Transact-SQL SETステートメントなどのコマンドの実行に使用した場合に、期待した効果が得られない場合があります。

これをテストして説明を確認する時間はありませんが、非常に単純な呼び出しを実行し、クエリテキストを渡して、で提供されるパラメーターを含める単純なコンソールアプリを作成するのは簡単ですSqlParameter。私の推測では、ということですExecuteNonQueryし、ExecuteScalar使いもsp_executesql、彼らはまた、パラメータを渡すためにできるようにするので、なぜそれらが実行されている方法のための別のパスが存在することになりますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.