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

How to query another attribute from next level of XML hierarchy in SQL Server 2012?(如何从SQL Server 2012中的下一级XML层次结构中查询另一个属性?)
本文介绍了如何从SQL Server 2012中的下一级XML层次结构中查询另一个属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对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)

到目前为止还不错,因为我从第三个层次结构中拿回了期望值:

选择参数名称

  1. SomeSelName_A
  2. SomeSelName_B

但我还需要的是<actionobject>中的name属性(如果存在,SomeSelName_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()]:()’ 需要单例(或空序列),找到的操作数类型 ‘xdt:untypeATIONAL*’

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

非常感谢,皮特

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>

推荐答案

您需要告诉您要访问<actionobject>子节点!

使用以下语句:

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)

您应该会得到所需的输出。

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

,则这将起作用

更新:如果<selection>下可以有多个<actionobject>节点,则需要执行"嵌套"CROSS APPLY

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)

通过这种方式,您可以处理多个子节点并根据需要提取它们的属性

这篇关于如何从SQL Server 2012中的下一级XML层次结构中查询另一个属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
SSIS: Model design issue causing duplications - can two fact tables be connected?(SSIS:模型设计问题导致重复-两个事实表可以连接吗?)
SQL Server Graph Database - shortest path using multiple edge types(SQL Server图形数据库-使用多种边类型的最短路径)
Invalid column name when using EF Core filtered includes(使用EF核心过滤包括时无效的列名)
How should make faster SQL Server filtering procedure with many parameters(如何让多参数的SQL Server过滤程序更快)
How can I generate an entity–relationship (ER) diagram of a database using Microsoft SQL Server Management Studio?(如何使用Microsoft SQL Server Management Studio生成数据库的实体关系(ER)图?)