【问题标题】:Assign ID's to XML hierarchy using SQL/XQuery使用 SQL/XQuery 将 ID 分配给 XML 层次结构
【发布时间】: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


    【解决方案1】:

    请尝试以下解决方案。

    当定义了默认命名空间时 - 无需使用命名空间通配符 (*)。

    TimeSeriesID 列值是使用 XQuery FLWOR 表达式和 XQuery 节点比较运算符计算的。

    SQL

    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>B21</psrType>
            </MktPSRType>
        </TimeSeries>
    </GL_MarketDocument>';
    
    WITH XMLNAMESPACES (DEFAULT 'urn:iec62325.351:tc57wg16:451-6:generationloaddocument:3:0')
    SELECT c1.value('for $i in . return count(/GL_MarketDocument/TimeSeries[. << $i]) + 1', 'INT') AS TimeSeriesID
        , DENSE_RANK() OVER(PARTITION BY c1 ORDER BY c2) as MktpsrtID
        , c2.value('(psrType/text())[1]', 'nvarchar(5)') as [psrType]
    FROM @XMLDocument.nodes('/GL_MarketDocument/TimeSeries') AS t1(c1)
        OUTER APPLY t1.c1.nodes('MktPSRType') as t2(c2);
    

    输出

    +--------------+-----------+---------+
    | TimeSeriesID | MktpsrtID | psrType |
    +--------------+-----------+---------+
    |            1 |         1 | B11     |
    |            1 |         2 | B12     |
    |            2 |         1 | B21     |
    +--------------+-----------+---------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多