C# 为什么SQL Server SHOWPLAN_XML通过DbCommand(参数化)不返回结果?

C# 为什么SQL Server SHOWPLAN_XML通过DbCommand(参数化)不返回结果?,c#,sql-server,sql-server-2008,parameterized-query,dbcommand,C#,Sql Server,Sql Server 2008,Parameterized Query,Dbcommand,我希望通过C#收集查询计划,以改进开发 我的方法是使用DbCommand和在 但是 非参数化查询将集体返回查询计划 参数化查询将不返回任何内容 SQL Server 2008 R2和LocalDB(2012)都有相同的问题 如何获取参数化查询的计划 你知道为什么我的参数化查询不可规划吗 [样本:复制步骤] 1.创建表。 我终于找到了丑陋而有限的答案。 为什么丑陋?因为它必须执行SQL 所以。。。我必须排除“非选择”SQL以避免重复的数据更改 我可以得到QueryPlan时,在同一时间跟踪

我希望通过C#收集查询计划,以改进开发

我的方法是使用
DbCommand

但是

  • 非参数化查询
    将集体返回查询计划
  • 参数化查询
    将不返回任何内容
SQL Server 2008 R2和LocalDB(2012)都有相同的问题

如何获取参数化查询的计划

你知道为什么我的参数化查询不可规划吗


[样本:复制步骤] 1.创建表。
我终于找到了丑陋而有限的答案。
为什么丑陋?因为它必须执行SQL

所以。。。我必须排除“非选择”SQL以避免重复的数据更改

我可以得到QueryPlan时,在同一时间跟踪

  • 使用
    SET STATISTICS XML ON(关闭)
  • 使用ExecuteReader()

  • 不要创建SqlParameters,而是创建一组T-SQL DECLARE语句并为查询添加前缀。然后,该计划将按预期工作

    DECLARE @BananaId INT
    SELECT BananaId, Title FROM Banana Where BananaId = @BananaId
    
    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)
    }
    
    DECLARE @BananaId INT
    SELECT BananaId, Title FROM Banana Where BananaId = @BananaId