Sql server 如何在SQL Server 2012中从下一级XML层次结构查询另一个属性?

Sql server 如何在SQL Server 2012中从下一级XML层次结构查询另一个属性?,sql-server,xml,xpath,xquery,Sql Server,Xml,Xpath,Xquery,我对xml非常陌生,需要一些帮助来查询SQL Server 2012中的xml列 到目前为止,我有以下声明: SELECT sel.value('@name', 'varchar(max)') AS SelectionParamterNames FROM [schm].[sometable] T1 CROSS APPLY Selection.nodes('//syntax/selections/selection') R(sel) SELECT SelectionParamte

我对xml非常陌生,需要一些帮助来查询SQL Server 2012中的xml列

到目前为止,我有以下声明:

SELECT sel.value('@name', 'varchar(max)')  AS SelectionParamterNames
FROM [schm].[sometable] T1
CROSS APPLY Selection.nodes('//syntax/selections/selection') R(sel)
SELECT   
    SelectionParamterNames = sel.value('@name', 'varchar(max)'),
    SelectionProcedureNames = sel.value('(actionobject/@name)[1]', 'varchar(50)')
FROM 
    [schm].[sometable] T1
CROSS APPLY 
    Selection.nodes('/syntax/selections/selection') R(sel)
到目前为止还不错,因为我从第三层次结构中得到了预期值:

选择参数名称

  • 某人的名字
  • 某人的名字
  • 但是我还需要
    中的属性
    name
    (如果存在,
    SomeSelName\u B
    没有它)

    我以为这样就行了:

        SELECT   sel.value('@name', 'varchar(max)')  AS SelectionParamterNames
               , sel.value('.//@name', 'varchar(max)')  AS SelectionProcedureNames
        FROM [schm].[sometable] T1
        CROSS APPLY Selection.nodes('//syntax/selections/selection') R(sel)
    
    我期望:

    SelectionParameterNames | SelectionProcedureNames
    --------------------------------------------------     
     1. SomeSelName_A       | sp_someprocedure_a 
     2. SomeSelName_B       | NULL
    
    但我得到的回报是:

    XQuery[Structure.TM_TemplateVersion.Selection.value()]:'value()' 需要找到类型为的单例(或空序列)操作数 “xdt:非类型数据组*”

    我花了相当长的时间来理解语法,但时间不多了,我需要一些帮助

    非常感谢,皮特

    XML内容:

    <syntax type="Selection">
      <selections>
        <selection type="Selection" name="SomeSelName_A" caption="SomeSelCaption_A" control="List" multivalue="True" clonetemplate="False" description="">
          <actionobject type="DbObject" datasourcename="SomeSource" objecttype="StoredProcedure" schema="schm" initialsql="schm.sp_someprocedure_a 1" name="sp_someprocedure_a">
            <parameters>
              <parameter name="@p_parameter_a" type="Parameter" datatype="Int" inputtype="Constant" inputvalue="1" required="False" iskey="False" />
              <parameter name="@p_parameter_b" type="Parameter" datatype="Int" inputtype="Constant" inputvalue="1" required="False" iskey="False" />
            </parameters>
            <columns>
              <column name="SomeColID_A" type="Column" datatype="Int" iskey="False" useas="Value" />
              <column name="SomeColName_A" type="Column" datatype="VarChar" iskey="False" useas="Text" />
            </columns>
          </actionobject>
        </selection>
        <selection type="Selection" name="SomeSelName_B" caption="SomeSelCaption_B" control="Calender" multivalue="false" clonetemplate="False" description="" />
      </selections>
    </syntax>
    

    您需要告诉您的XQuery您想要访问
    子节点

    使用以下语句:

    SELECT sel.value('@name', 'varchar(max)')  AS SelectionParamterNames
    FROM [schm].[sometable] T1
    CROSS APPLY Selection.nodes('//syntax/selections/selection') R(sel)
    
    SELECT   
        SelectionParamterNames = sel.value('@name', 'varchar(max)'),
        SelectionProcedureNames = sel.value('(actionobject/@name)[1]', 'varchar(50)')
    FROM 
        [schm].[sometable] T1
    CROSS APPLY 
        Selection.nodes('/syntax/selections/selection') R(sel)
    
    你应该得到你想要的结果

    如果您的
    节点始终最多包含一个
    类型的元素,并且它将读取该元素的
    名称
    属性(如果存在)(否则返回
    NULL

    更新:如果您可以在
    下有多个
    节点,则需要执行“嵌套的”
    交叉应用

    SELECT   
        SelectionParamterNames = sel.value('@name', 'varchar(max)'),
        SelectionProcedureNames = ActObj.value('@name', 'varchar(50)')
    FROM 
        [schm].[sometable] T1
    CROSS APPLY 
        Selection.nodes('/syntax/selections/selection') R(sel)
    CROSS APPLY
        sel.nodes('actionobject') AS XmlTbl(ActObj)
    

    这样,您就可以处理多个子节点并根据需要提取它们的属性

    非常感谢!还有一件事。我现在想,我必须告诉它去哪个子节点,并通过使用[1]告诉它从'first'元素返回指定的值。现在,如果有n个元素,我该如何告诉你,如何将它们全部返回。在提供的xml示例中,我希望返回“@p_parameter_a”和“@p_parameter_b”@Pete:更新我的响应以显示如何处理多个子节点-如果这些子节点存在,这不仅有助于解决我的问题,而且有助于理解!非常感谢@皮特:很高兴与大家分享和帮助,如果可以的话!