SQL 服务器中的 value() 和 nodes() 方法

value() and nodes() method in SQL server

这是我的代码

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 and actionName = get.

我是 xquery 的新手,想知道如何从这行代码返回 objectName:

"b.value('../../@name', 'NVARCHAR(50)') AS objectName"

为什么不这样:

"b.value('../@name', 'NVARCHAR(50)') AS objectName"

我认为自从根元素中的 'name' 字段我可以使用'..@/name',但它给了我 NULL。 有人请解释'../../' shorthand 用于什么/如何使用它?有什么链接可以理解吗?

.. 实际上意味着返回一级。别名 b 指的是级别 /object/components/component。因此,如果您返回一个级别(使用单个 ..),您最终会到达节点 components(特别是 /object/components)。因此,对于 b.value('../@name', 'NVARCHAR(50)'),您将尝试 return components 节点的 name 的值;它没有。

因此,要返回object节点,需要返回2级,即使用../../.

这个想法与您在命令行中的想法相同。例如 C:\Windows\System32> ls ..\.. 将在 Windows 中列出 C:\ 的内容,或者 larnu@desktop:/var/opt/mssql$ ls ../.. 将在 Unix 中列出 /var 的内容。