本文介紹了如何從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)
到目前為止還不錯,因為我從第三個層次結構中拿回了期望值:
選擇參數名稱
-
SomeSelName_A
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層次結構中查詢另一個屬性?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,