这是我的代码
DECLARE @dataModel XML
SET @dataModel =
'<object name = "cardApplication" type = "businessObject" mainTableSchema = "card" mainTableName = "application" >
<components>
<component name = "get">
</component>
</components>
</object>'
SELECT b.value('../../@name', 'NVARCHAR(50)') AS objectName,
b.value('@name', 'NVARCHAR(50)') AS actionName
FROM @dataModel.nodes('/object/components/component') AS a(b)
这里我得到的输出是 objectName = cardApplication和actionName = get。
我是xquery的新手,并想知道如何从这一行返回objectName:
"b.value('../../@name', 'NVARCHAR(50)') AS objectName"
为什么不这样:
"b.value('../@name', 'NVARCHAR(50)') AS objectName"
我想是因为这个名字&#39; root元素中的字段我可以使用&#39; .. @ / name&#39;,但它给我NULL。 有人请解释一下&#39; ../../ 39;简写用于/如何使用它?任何理解这个的链接?
答案 0 :(得分:0)
..
实际上意味着返回一个级别。别名b
引用级别/object/components/component
。因此,如果您返回一个级别(使用单个..
),您最终会在节点components
(特别是/object/components
)。因此,对于b.value('../@name', 'NVARCHAR(50)')
,您将尝试为name
节点返回components
的值;它没有。
因此,要返回object
节点,您需要返回2个级别,这意味着使用../../
。
如果你在命令行中,这个想法是一样的。例如,C:\Windows\System32> ls ..\..
将列出Windows中C:\
的内容,或larnu@desktop:/var/opt/mssql$ ls ../..
将列出Unix中/var
的内容。