Sql-Server

sp_executesql 可以預設配置/使用嗎?

  • June 3, 2019

我正在研究一個對 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 性能,同時它可能會導致使用與初始創建的查詢計劃不同的參數值的某些查詢的性能不佳(參數嗅探問題)。

看:

上面的範例是使用 .NET Framework 4.5 和 SQL Server 2008 Developer Edition 創建的。

引用自:https://dba.stackexchange.com/questions/123978