SQL Server

时间:2018-04-10 11:47:53

标签: sql-server xml xml-parsing xquery xquery-sql

这是我的代码

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;简写用于/如何使用它?任何理解这个的链接?

1 个答案:

答案 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的内容。