Sql-Server
sp_executesql 可以預設配置/使用嗎?
我正在研究一個對 SQL Server 使用高度動態的 sql 查詢的應用程序。查看以非常奇怪和復雜的方式建構的查詢,但這是一個不同的故事,我告訴它給我一個很好的理由讓我自己無法(太愚蠢)找到事情……我看不到查詢用
sp_executesql
.但是當我跟踪時,我可以看到很多查詢都用
sp_executesql
. 整個應用程序解決方案甚至根本不包含命令sp_executesql
。所以我想知道是否有一種我還不知道的配置強制軟體預設使用 sp_executesql 包裝查詢?
什麼可能導致這種行為?
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 性能,同時它可能會導致使用與初始創建的查詢計劃不同的參數值的某些查詢的性能不佳(參數嗅探問題)。看:
- https://blogs.technet.microsoft.com/mdegre/2011/11/06/what-is-parameter-sniffing/
- http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql
- http://www.sqlskills.com/blogs/kimberly/exec-and-sp_executesql-how-are-they-different
- http://www.brentozar.com/archive/2013/06/optimize-for-unknown-sql-server-parameter-sniffing/
- https://sqlblog.org/2011/09/17/bad-habits-to-kick-using-exec-instead-of-sp_executesql
上面的範例是使用 .NET Framework 4.5 和 SQL Server 2008 Developer Edition 創建的。