如何将动态XML值列拆分和解析为几行?

时间:2018-07-03 12:37:00

标签: sql sql-server xml

我想知道如何将长XML值拆分和解析为一行。我已经在该网站上看到了一些用于通过'进行分割的选项,但由于我的字段中没有逗号,因此这对我不起作用。供参考,数据如下所示:

[XMLColumn]
<Student><Id>uniqueidentifier</Id><Name>Chris</Name><Grade>11</Grade></Student><Student><Id>uniqueidentifier</Id><Name>Joe</Name><Grade>4</Grade></Student><Student><Id>uniqueidentifier</Id><Name>Alex</Name><Grade>9</Grade></Student><Student><Id>uniqueidentifier</Id><Name>Mary</Name><Grade>2</Grade></Student>

我想对每个学生标签(<Student></Student>)进行拆分,因此看起来可能像这样:

Id                    Name        Grade
uniqueidentifier      Chris        11
uniqueidentifier      Joe          4
uniqueidentifier      Alex         9
uniqueidentifier      Mary         2

同样理想地,除非函数的复杂度低,否则我不希望使用它。我只是在对已经完成的现有学校项目进行实验,看看是否有方法可以使查询速度更快。

问题是,尽管我将永远知道学生(Id, Name, and Grade)的属性,但是内部的数据将始终具有不同的长度,因此即使在特定索引处拆分也不一定有效。如果有人可以帮助,那就太好了。

1 个答案:

答案 0 :(得分:0)

将数据转换为XML,并使用xQuery分解XML对象/文档。

Declare @XML XML = N'<Student>
                          <Id>uniqueidentifier</Id>
                          <Name>Chris</Name>
                          <Grade>11</Grade>
                       </Student>
                       <Student>
                          <Id>uniqueidentifier</Id>
                          <Name>Joe</Name>
                          <Grade>4</Grade>
                       </Student>
                       <Student>
                          <Id>uniqueidentifier</Id>
                          <Name>Alex</Name>
                          <Grade>9</Grade>
                       </Student>
                       <Student>
                          <Id>uniqueidentifier</Id>
                          <Name>Mary</Name>
                          <Grade>2</Grade>
                       </Student>'

SELECT
      X.StockData.query('Id').value('.','VARCHAR(100)')     AS [Id]
    , X.StockData.query('Name').value('.','VARCHAR(100)')   AS [Name]
    , X.StockData.query('Grade').value('.','INT')           AS [Grade]

FROM @XML.nodes('Student') AS X(StockData)

输出

╔══════════════════╦═══════╦═══════╗
║        Id        ║ Name  ║ Grade ║
╠══════════════════╬═══════╬═══════╣
║ uniqueidentifier ║ Chris ║    11 ║
║ uniqueidentifier ║ Joe   ║     4 ║
║ uniqueidentifier ║ Alex  ║     9 ║
║ uniqueidentifier ║ Mary  ║     2 ║
╚══════════════════╩═══════╩═══════╝