【发布时间】:2021-05-31 21:44:13
【问题描述】:
我想使用 XML 给出的层次结构从 XML 文档中提取 ID。文档中没有 ID,它们必须使用文档的结构创建。
这是 XML 文档:
<GL_MarketDocument xmlns="urn:iec62325.351:tc57wg16:451-6:generationloaddocument:3:0">
<TimeSeries>
<MktPSRType>
<psrType>B11</psrType>
</MktPSRType>
<MktPSRType>
<psrType>B12</psrType>
</MktPSRType>
</TimeSeries>
<TimeSeries>
<MktPSRType>
<psrType>B11</psrType>
</MktPSRType>
</TimeSeries>
</GL_MarketDocument>
我使用以下代码创建代表 XML 层次结构的 ID。我的想法是使用行编号,但我没有得到它的工作。
DECLARE @XMLDocument XML =
N'<GL_MarketDocument xmlns="urn:iec62325.351:tc57wg16:451-6:generationloaddocument:3:0">
<TimeSeries>
<MktPSRType>
<psrType>B11</psrType>
</MktPSRType>
<MktPSRType>
<psrType>B12</psrType>
</MktPSRType>
</TimeSeries>
<TimeSeries>
<MktPSRType>
<psrType>B11</psrType>
</MktPSRType>
</TimeSeries>
</GL_MarketDocument>';
WITH XMLNAMESPACES (DEFAULT 'urn:iec62325.351:tc57wg16:451-6:generationloaddocument:3:0')
SELECT row_number() over (partition by T.N order by T.N) as TimeSeriesID,
row_number() over(partition by T.N order by T1.N) as MktpsrtID,
T2.N.value('(*:psrType/text())[1]', 'nvarchar(5)') as [psrType]
FROM @XMLDocument.nodes('/GL_MarketDocument') AS T(N)
outer apply T.N.nodes('*:TimeSeries') as T1(N)
outer apply T1.N.nodes('*:MktPSRType') as T2(N)
结果是:
| TimeSeriesID | MktpsrtID | psrType |
|---|---|---|
| 1 | 1 | B11 |
| 2 | 2 | B12 |
| 3 | 3 | B11 |
我想看的是下面的编号,代表XML的节点结构。
| TimeSeriesID | MktpsrtID | psrType |
|---|---|---|
| 1 | 1 | B11 |
| 1 | 2 | B12 |
| 2 | 1 | B11 |
row_number() 的使用不太重要,我正在寻找解决问题的最有效方法。
【问题讨论】:
标签: sql-server xml tsql xquery