C# 为什么SQL Server SHOWPLAN_XML通过DbCommand(参数化)不返回结果?
我希望通过C#收集查询计划,以改进开发 我的方法是使用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时,在同一时间跟踪
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