【问题标题】:Stored procedure xml query存储过程xml查询
【发布时间】:2012-01-19 09:08:41
【问题描述】:

更多的反思是一个问题。我正在创建一个以 xml 作为输入参数的存储过程,并且在查询数据时遇到了一些问题。

这是查询之一

DECLARE @xVar XML
SET @xVar = 
  '<?xml version="1.0"?>
<Workflow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ait.com/workflow/">
  <Users>
    <User ObjectId="1232">
      <UserId>123</UserId>
    </User>
    <User ObjectId="1232">
      <UserId>124</UserId>
    </User>
  </Users>
</Workflow>';


WITH XMLNAMESPACES(DEFAULT 'http://ait.com/workflow/') 
SELECT  [UserId] = reportdata.item.value('UserId[1]', 'varchar(36)')

FROM   @xVar.nodes('//Workflow/Users/User') AS reportdata(item)  

这只是返回 xml 文档中的用户 ID。如果我仔细看看 select 语句的最后一部分

FROM   @xVar.nodes('//Workflow/Users/User') AS reportdata(item)  

它有效并且看起来合乎逻辑,从根开始并指定路径,我奇怪的是这也有效

FROM   @xVar.nodes('//Users/User') AS reportdata(item)  

甚至更奇怪的是它的工作原理

FROM   @xVar.nodes('//User') AS reportdata(item)  

可能错过了 XML Book for dummy 中的某些页面,请有人赐教

【问题讨论】:

    标签: xml tsql stored-procedures


    【解决方案1】:

    双精度// 表示它将为您提供与表达式匹配的所有后代节点。

    这个//Workflow/Users/User 并不意味着“从根开始”。从根匹配的表达式如下所示/Workflow/Users/User

    所以//User 将为您提供所有后代用户节点,无论它们在哪里。

    试试这个:

    declare @XML xml = 
    '<root>
      <user>1</user>
      <user>2</user>
      <child>
        <user>3</user>
      </child>
    </root>'
    
    select T.N.value('.',  'int') as Value
    from @XML.nodes('//user') as T(N)
    
    select T.N.value('.',  'int') as Value
    from @XML.nodes('/user') as T(N)
    
    select T.N.value('.',  'int') as Value
    from @XML.nodes('/root/user') as T(N)
    

    结果:

    Value
    -----------
    1
    2
    3
    
    (3 row(s) affected)
    
    Value
    -----------
    
    (0 row(s) affected)
    
    Value
    -----------
    1
    2
    
    (2 row(s) affected)
    

    【讨论】:

    • 再次感谢。喜欢你的回答教学法,彻底和尊重。干得好
    【解决方案2】:

    一点都不奇怪。

    它所做的是搜索所有 xml 树,直到找到预期的用户叶。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 2016-01-24
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多