代码之家  ›  专栏  ›  技术社区  ›  Mar1009

SQL server中的value()和nodes()方法

  •  0
  • Mar1009  · 技术社区  · 7 年前

    这是我的密码

    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"
    

    我认为由于根元素中的“name”字段,我可以使用“@/“name”,但它给我空值。 请有人解释一下“../../用于/如何使用它的速记?有任何链接可以理解这一点吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Thom A    7 年前

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

    因此,要回到 object 节点,您需要返回2个级别,这意味着使用 ../../

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