【问题标题】:SQL Server -XML nodes not returning multiple recordsSQL Server -XML 节点不返回多条记录
【发布时间】:2017-02-14 17:51:48
【问题描述】:

我试图了解 SQL、XML 节点和交叉应用,我原以为下面的代码会返回 3 行数据,但我只得到一个。我曾认为使用 Cross apply 将查询连接回自身会为我解决这个问题。

谁能告诉我我做错了什么?

提前致谢

DECLARE @XML AS XML;

SELECT @XML = ('<Deal deal_id="821">
  <Application_owner>me</Application_owner>
   <Deal_files>
    <File>file1.doc</File>
    <File>file2.pdf</File>
    <File>file3.xcl</File>
  </Deal_files>
</Deal>
')

select 
    t.n.value('@deal_id', 'int') as [ID],
    f.n.value('(File)[1]','varchar(50)') as [FILENAME]
from 
    @XML.nodes('Deal') t(n)
cross apply 
    t.n.nodes('Deal_files') f(n)

【问题讨论】:

  • t.n.nodes('Deal_files') 只匹配一个元素,因此您只能从中获得一个 SQL 行(将包含 3 个 XML 元素/行)。

标签: sql sql-server xml tsql


【解决方案1】:

你很亲密

DECLARE @XML AS XML;

SELECT @XML = ('<Deal deal_id="821">
  <Application_owner>me</Application_owner>
   <Deal_files>
    <File>file1.doc</File>
    <File>file2.pdf</File>
    <File>file3.xcl</File>
  </Deal_files>
</Deal>
'
)

Select 
    ID = t.n.value('@deal_id', 'int'),
    FileName = f.n.value('(.)[1]','varchar(50)') 
From  
    @XML.nodes('Deal') t(n)
Cross Apply 
    t.n.nodes('Deal_files/*') f(n)

返回

ID  FileName
--------------
821 file1.doc
821 file2.pdf
821 file3.xcl

【讨论】:

  • 嗨,让我有点挑剔:t.n.nodes('Deal_files/*') 应该是t.n.nodes('Deal_files/File') 只是为了确保不返回其他节点......我这边+1
  • 感谢您的回答。如果我理解正确,我的错误是命名元素而不是使用“。”在这种情况下不会带回多行,因为只有一个“Deal_files”?
  • @Dan Happy 它有帮助,是的,您对名称与“。”的看法是正确的
猜你喜欢
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多