gpt4 book ai didi

c# - 为什么通过 DbCommand(Parameterized) 的 SQL Server SHOWPLAN_XML 不返回结果?

转载 作者:行者123 更新时间:2023-11-30 12:26:57 24 4
gpt4 key购买 nike

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

我的方法是使用 DbCommandSET SHOWPLAN_XML ON

但是……

  • 非参数化查询会统一返回查询计划。
  • 参数化查询 将不返回任何内容!

SQL Server 2008 R2 和 LocalDB(2012) 都有同样的问题。

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

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


[示例:重现步骤]

1。创建表。

CREATE TABLE Banana (  BananaId             int IDENTITY(100,1),  Title                nvarchar(512),);GOALTER TABLE Banana    ADD CONSTRAINT Banana_PK PRIMARY KEY(BananaId);GO

2. Execute queries

  • Non-Parameterized query

    This wll be return plan:

    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

关于c# - 为什么通过 DbCommand(Parameterized) 的 SQL Server SHOWPLAN_XML 不返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27222879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com