Sql server 如何将XML解析为列

Sql server 如何将XML解析为列,sql-server,xml,sql-server-2012,Sql Server,Xml,Sql Server 2012,我想解析这个Xml以得到以下结果。表的名称是SchoolRecord Name Answer School name 87f6c8bf-cafc-40fb-a082-ca9d5bfaf1e0 Course 2f23e1cb-181e-4af2-a9ec-3dd68530d1d5 Father NULL Mother NULL 我正在使用SQL Server 2012。这是我尝试过的

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

Name               Answer
School name        87f6c8bf-cafc-40fb-a082-ca9d5bfaf1e0
Course             2f23e1cb-181e-4af2-a9ec-3dd68530d1d5
Father             NULL
Mother             NULL
我正在使用SQL Server 2012。这是我尝试过的,但没有成功

一,

二,

三,

我的结果

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>

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

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区分大小写,因此请尝试使用数据,而不是现有的数据。e、 值'data/School_data/ControlGroup/UserDefinedControls/Control/Name[1],'varcharmax'作为名称,谢谢,我能猜出来。XML区分大小写。我把数据改成了数据。
Name      Answer
NULL      NULL
NULL      NULL
NULL      NULL
NULL      NULL 
        <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>
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);