【问题标题】:How to parse XML to columns如何将 XML 解析为列
【发布时间】:2014-10-31 22:15:24
【问题描述】:

我想解析这个 Xml 以获得以下结果。表名是 SchoolRecord

Name               Answer
School name        87f6c8bf-cafc-40fb-a082-ca9d5bfaf1e0
Course             2f23e1cb-181e-4af2-a9ec-3dd68530d1d5
Father             NULL
Mother             NULL

我使用的是 SQL Server 2012。这是我尝试过的,但没有成功

1.

Select 
S.userdefinedxml.value('(/ControlGroup/UserDefinedControls/Control/Name)[1]','varchar(max)' ) as Name,
S.userdefinedxml.value('(/ControlGroup/UserDefinedControls/Control/Answer)[1]','varchar(max)' ) as Answer
From SchoolRecord S

2.

Select 
S.userdefinedxml.value('(School_Data/ControlGroup/UserDefinedControls/Control/Name)[1]','varchar(max)' ) as Name,
S.userdefinedxml.value('(School_Data/ControlGroup/UserDefinedControls/Control/Answer)[1]','varchar(max)' ) as Answer
From SchoolRecord S

3.

Select 
S.userdefinedxml.value('(Data/School_Data/ControlGroup/UserDefinedControls/Control/Name)[1]','varchar(max)' ) as Name,
S.userdefinedxml.value('(Data/School_Data/ControlGroup/UserDefinedControls/Control/Answer)[1]','varchar(max)' ) as Answer
From SchoolRecord S

我的结果

Name      Answer
NULL      NULL
NULL      NULL
NULL      NULL
NULL      NULL 

我的 XML :

        <data>
          <School_Data>
            <ControlGroup>
              <UserDefinedControls>
                <Control>
                  <ControlType>FIND</ControlType>
                  <Name>School name</Name>
                  <Answer>87f6c8bf-cafc-40fb-a082-ca9d5bfaf1e0</Answer>
                </Control>
              </UserDefinedControls>
              <UserDefinedControls>
                <Control>
                  <ControlType>FIND</ControlType>
                  <Name>Course</Name>
                  <Answer>2f23e1cb-181e-4af2-a9ec-3dd68530d1d5</Answer>
                </Control>
              </UserDefinedControls>
              <UserDefinedControls>
                <Control>
                  <ControlType>FIND</ControlType>
                  <Name>Father</Name>
                  <Answer />
                </Control>
              </UserDefinedControls>
              <UserDefinedControls>
                <Control>
                  <ControlType>FIND</ControlType>
                  <Name>Mother</Name>
                  <Answer />
                </Control>
              </UserDefinedControls>
            </ControlGroup>
          </School_Data>
        </data>

【问题讨论】:

  • XML 区分大小写,因此请尝试使用data 而不是Data。例如S.userdefinedxml.value('(data/School_Data/ControlGroup/UserDefinedControls/Control/Name)[1]','varchar(max)' ) as Name,

标签: sql-server xml sql-server-2012


【解决方案1】:

我看到 Yuck 提到元素和属性名称是区分大小写的。下面是一个从每个控件返回名称和答案的示例:

SELECT
    Control.value('Name[1]','varchar(max)' ) as Name,
    Control.value('Answer[1]','varchar(max)' ) as Answer
FROM dbo.SchoolRecord S
CROSS APPLY S.userdefinedxml.nodes('/data/School_Data/ControlGroup/UserDefinedControls/Control') AS UserDefinedControls(Control);

【讨论】:

  • 谢谢,我能弄明白。 XML 区分大小写。我将数据更改为数据。
猜你喜欢
  • 2021-03-15
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2017-11-07
相关资源
最近更新 更多