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
的内容。
这是我的代码
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
的内容。