簡體   English   中英

為什么SQL Server SHOWPLAN_XML通過DbCommand(參數化)不返回結果?

[英]Why SQL Server SHOWPLAN_XML via DbCommand(Parameterized) is not return results?

我希望通過C#收集查詢計划以改進開發。

我的方法是使用DbCommandSET SHOWPLAN_XML ON

但...

  • Non-parameterized query將收集返回查詢計划。
  • Parameterized query將不返回任何內容!

SQL Server 2008 R2和LocalDB(2012)都有同樣的問題。

如何獲得參數化查詢的計划?

你知道為什么我的參數化查詢不可規划嗎?


[示例:重現的步驟]

1.創建表格。

CREATE TABLE Banana (
  BananaId             int IDENTITY(100,1),
  Title                nvarchar(512),
);
GO

ALTER TABLE Banana
    ADD CONSTRAINT Banana_PK PRIMARY KEY(BananaId);
GO

2.執行查詢

  • 非參數化查詢

    這將是退貨計划:

     using (var conn = new SqlConnection( {Connection Strings} )) { conn.Open(); DbCommand command = conn.CreateCommand(); command.CommandText = "SET SHOWPLAN_XML ON;"; command.CommandType = CommandType.Text; command.ExecuteNonQuery(); command.CommandText = "SELECT BananaId, Title FROM Banana Where BananaId = 999"; var plan = (string)command.ExecuteScalar(); command.CommandText = "SET SHOWPLAN_XML OFF;"; command.ExecuteNonQuery(); Debug.WriteLine(plan); // <ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" ... } 
  • 參數化查詢

    這不是響應計划:

     using (var conn = new SqlConnection( {Connection Strings} )) { conn.Open(); DbCommand command = conn.CreateCommand(); command.CommandText = "SET SHOWPLAN_XML ON;"; command.CommandType = CommandType.Text; command.ExecuteNonQuery(); command.CommandText = "SELECT BananaId, Title FROM Banana Where BananaId = @BananaId"; var parameter = command.CreateParameter(); parameter.ParameterName = "@BananaId"; parameter.Value = 999; command.Parameters.Add(parameter); var plan = (string)command.ExecuteScalar(); command.CommandText = "SET SHOWPLAN_XML OFF;"; command.ExecuteNonQuery(); Debug.WriteLine(plan); // (null) } 

而不是創建SqlParameters,創建一堆T-SQL DECLARE語句並為您的查詢添加前綴。 然后該計划將按預期工作。

DECLARE @BananaId INT
SELECT BananaId, Title FROM Banana Where BananaId = @BananaId

最后我找到了ugry和有限的答案。
為什么丑? 因為它必須執行SQL!

所以...我必須排除“NON SELECT”SQL以避免重復的數據更改。

我可以在同時關注時獲取QueryPlan。

  1. 使用SET STATISTICS XML ON(OFF)
  2. 使用ExecuteReader()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM