[英]Why SQL Server SHOWPLAN_XML via DbCommand(Parameterized) is not return results?
I wish to collect Query plan via C# for improve development. 我希望通过C#收集查询计划以改进开发。
My approach is use DbCommand
and SET SHOWPLAN_XML ON
我的方法是使用
DbCommand
和SET SHOWPLAN_XML ON
But... 但...
Non-parameterized query
will return query plan collectly. Non-parameterized query
将收集返回查询计划。 Parameterized query
will return nothing! Parameterized query
将不返回任何内容! Both SQL Server 2008 R2 and LocalDB(2012) have same problem. SQL Server 2008 R2和LocalDB(2012)都有同样的问题。
How can I get plan of parameterized query? 如何获得参数化查询的计划?
Do you know why my parameterized query is not plannable? 你知道为什么我的参数化查询不可规划吗?
CREATE TABLE Banana ( BananaId int IDENTITY(100,1), Title nvarchar(512), ); GO ALTER TABLE Banana ADD CONSTRAINT Banana_PK PRIMARY KEY(BananaId); GO
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" ... }
Prameterized query 参数化查询
This is not response 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 = @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) }
Instead of creating SqlParameters, create a bunch of T-SQL DECLARE statements and prefix your query. 而不是创建SqlParameters,创建一堆T-SQL DECLARE语句并为您的查询添加前缀。 Then the plan will work as expected.
然后该计划将按预期工作。
DECLARE @BananaId INT
SELECT BananaId, Title FROM Banana Where BananaId = @BananaId
Finally I found ugry and limited answer. 最后我找到了ugry和有限的答案。
Why ugry? 为什么丑? Because it must execute SQL!
因为它必须执行SQL!
So... I must exclude "NON SELECT" SQL to avoid duplicate data change. 所以...我必须排除“NON SELECT”SQL以避免重复的数据更改。
I could get QueryPlan when following at the same time. 我可以在同时关注时获取QueryPlan。
SET STATISTICS XML ON(OFF)
SET STATISTICS XML ON(OFF)
ExecuteReader()
ExecuteReader()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.