Извлечение информации ColumnReference из QueryPlan xml - PullRequest
0 голосов
/ 16 октября 2018

У меня большой xml, который является не чем иным, как планом запроса.Мне нужно извлечь из этого информацию о столбцах.

В этом xml есть тег, подобный приведенному ниже:

<ColumnReference Table="[TestTable]" Schema="[dbo]" Database="[Mydatabase]" Column="FirstName" Alias="a"/>

Я хочу извлечь информацию о таблице, схеме, столбце.ColumnReference скрывается внутри нескольких разных тегов.Но мне нужны все теги ColumnReference независимо от иерархии

выберите таблицу, схему, столбец из Columnreference

часть xml, например:

<RelOp EstimatedExecutionMode="Row" EstimateRewinds="0" EstimateRebinds="0" Parallel="1" EstimatedTotalSubtreeCost="92.6757" AvgRowSize="349" EstimateCPU="0.0439447" EstimateIO="0" EstimateRows="179.753" LogicalOp="Repartition Streams" PhysicalOp="Parallelism" NodeId="3">
<OutputList>
<ColumnReference Table="[REALESTATECONTRACT2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="ODS_REGIONCODE" Alias="[REC2]"/>
<ColumnReference Table="[REALESTATECONTRACT2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PRIMARYLOCATIONTRIIDTX" Alias="[REC2]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PATHTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTIDSY" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTFLOORTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTBUILDINGTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="NAMETX" Alias="[SP]"/>
<ColumnReference Table="[BUILDING1]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="STATEPROVTX" Alias="[BLD]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="COUNTRYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="CITYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="ACTIVESTARTDA" Alias="[BLD2]"/>
</OutputList>
<Parallelism PartitioningType="Hash">
<PartitionColumns>
<ColumnReference Table="[REALESTATECONTRACT2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PRIMARYLOCATIONTRIIDTX" Alias="[REC2]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="NAMETX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PATHTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTIDSY" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTFLOORTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTBUILDINGTX" Alias="[SP]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="CITYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING1]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="STATEPROVTX" Alias="[BLD]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="COUNTRYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="ACTIVESTARTDA" Alias="[BLD2]"/>
</PartitionColumns>

1 Ответ

0 голосов
/ 16 октября 2018

Может быть, это поможет вам:

DECLARE @xml XML=
N'<RelOp EstimatedExecutionMode="Row" EstimateRewinds="0" EstimateRebinds="0" Parallel="1" EstimatedTotalSubtreeCost="92.6757" AvgRowSize="349" EstimateCPU="0.0439447" EstimateIO="0" EstimateRows="179.753" LogicalOp="Repartition Streams" PhysicalOp="Parallelism" NodeId="3">
<OutputList>
<ColumnReference Table="[REALESTATECONTRACT2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="ODS_REGIONCODE" Alias="[REC2]"/>
<ColumnReference Table="[REALESTATECONTRACT2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PRIMARYLOCATIONTRIIDTX" Alias="[REC2]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PATHTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTIDSY" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTFLOORTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTBUILDINGTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="NAMETX" Alias="[SP]"/>
<ColumnReference Table="[BUILDING1]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="STATEPROVTX" Alias="[BLD]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="COUNTRYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="CITYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="ACTIVESTARTDA" Alias="[BLD2]"/>
</OutputList>
<Parallelism PartitioningType="Hash">
<PartitionColumns>
<ColumnReference Table="[REALESTATECONTRACT2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PRIMARYLOCATIONTRIIDTX" Alias="[REC2]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="NAMETX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PATHTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTIDSY" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTFLOORTX" Alias="[SP]"/>
<ColumnReference Table="[SPACE]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="PARENTBUILDINGTX" Alias="[SP]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="CITYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING1]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="STATEPROVTX" Alias="[BLD]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="COUNTRYTX" Alias="[BLD2]"/>
<ColumnReference Table="[BUILDING2]" Schema="[Tririga]" Database="[TRI_INTL_CERT]" Column="ACTIVESTARTDA" Alias="[BLD2]"/>
</PartitionColumns>
</Parallelism>
</RelOp>';

- я использую две переменные, вы можете адаптировать это к вашим потребностям

DECLARE @tableName VARCHAR(100)='[BUILDING2]';
DECLARE @ColumnName VARCHAR(100)='COUNTRYTX'

- Это будет использовать Xpath / XQueryвызвать глубокий поиск (//) для <ColumnReference>, но он вернет только строки, в которых выполнен предикат.

SELECT a.query('.')
FROM @xml.nodes(N'//ColumnReference[@Table=sql:variable("@tableName") 
                                    and @Column=sql:variable("@ColumnName")]') A(a);

UPDATE

Этот запрос вернет строку в столбцах:

DECLARE @tableName VARCHAR(100)='[BUILDING2]';
DECLARE @ColumnName VARCHAR(100)='COUNTRYTX'

SELECT a.value('@Table','nvarchar(max)') AS TableName
      ,a.value('@Schema','nvarchar(max)') AS SchemaName
      ,a.value('@Database','nvarchar(max)') AS DatabaseName
      ,a.value('@Column','nvarchar(max)') AS ColumnName
      ,a.value('@Alias','nvarchar(max)') AS Alias
FROM @xml.nodes(N'//ColumnReference[@Table=sql:variable("@tableName") 
                                    and @Column=sql:variable("@ColumnName")]') A(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...