Sql server 如何在SQL Server 2012中从下一级XML层次结构查询另一个属性?
我对xml非常陌生,需要一些帮助来查询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
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:更新我的响应以显示如何处理多个子节点-如果这些子节点存在,这不仅有助于解决我的问题,而且有助于理解!非常感谢@皮特:很高兴与大家分享和帮助,如果可以的话!