从 'show execution plan xml' 获取查询中的列、表的列表
Get list of columns, tables in query from 'show execution plan xml'
我需要从 SQL 服务器中的 'show execution plan xml' 查询中获取在 select 语句、连接、位置和排序依据中使用的列表列到 table 中。
例如查询:
Select a.id, a.name, a.gender, a.marks, b.address
From #temp a
Inner join #temp1 b
On a.id=b.id
Where id=1
输出应该是:
Select- id, name, gender, marks(from #temp)
Address(from #temp1)
Join - id
Where- id
全部合为table.
作为代码示例:
DECLARE @PLAN_XML XML;
--> put here the query you wanted to examine the plan
SELECT DISTINCT name, object_id, create_date
FROM sys.objects;
SELECT @PLAN_XML = query_plan
FROM sys.dm_exec_requests
OUTER APPLY sys.dm_exec_query_plan(plan_handle)
WHERE session_id = @@SPID;
WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan' )
SELECT CONCAT(x.p.value('(@Schema)', 'sysname'), N'.',
x.p.value('(@Table)', 'sysname'), N'.',
x.p.value('(@Column)', 'sysname')) AS OUTPUT_COLUMN
FROM @PLAN_XML.nodes( 'ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[1]/QueryPlan/RelOp/OutputList/*' ) x(p)
这会给你结果:
我需要从 SQL 服务器中的 'show execution plan xml' 查询中获取在 select 语句、连接、位置和排序依据中使用的列表列到 table 中。
例如查询:
Select a.id, a.name, a.gender, a.marks, b.address
From #temp a
Inner join #temp1 b
On a.id=b.id
Where id=1
输出应该是:
Select- id, name, gender, marks(from #temp)
Address(from #temp1)
Join - id
Where- id
全部合为table.
作为代码示例:
DECLARE @PLAN_XML XML;
--> put here the query you wanted to examine the plan
SELECT DISTINCT name, object_id, create_date
FROM sys.objects;
SELECT @PLAN_XML = query_plan
FROM sys.dm_exec_requests
OUTER APPLY sys.dm_exec_query_plan(plan_handle)
WHERE session_id = @@SPID;
WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan' )
SELECT CONCAT(x.p.value('(@Schema)', 'sysname'), N'.',
x.p.value('(@Table)', 'sysname'), N'.',
x.p.value('(@Column)', 'sysname')) AS OUTPUT_COLUMN
FROM @PLAN_XML.nodes( 'ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[1]/QueryPlan/RelOp/OutputList/*' ) x(p)
这会给你结果: