【问题标题】:T-Sql xml query with namespace带有命名空间的 T-Sql xml 查询
【发布时间】:2012-02-13 03:55:42
【问题描述】:

这是对

的后续问题

T-Sql xml query

如果我将命名空间添加到 xml 数据,则不会再次返回任何内容。

DECLARE @xVar XML
SET @xVar = 
  '<ReportData ObjectId="123" xmlns="http://ait.com/reportdata">
  <ReportId>AAAA-BBBB-CCCCC-DDDDD</ReportId>
  <DocId>100</DocId>
  <ReportName>Drag Scraper Troubleshooting</ReportName>
  <DocType>Name</DocType>
  <StatusId>1</StatusId>
  <AuthorId>1</AuthorId>
   </ReportData>'

SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM   @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 

上面的查询什么都不返回。其次,如何在一次选择中选择所有元素并返回所有元素作为字段的行?

我想返回一个构造如下的记录:

ReportId              | DocId | ReportName | 
AAAA-BBBB-CCCCC-DDDDD | 100   | AAAA-BBBB-CCCCC-DDDDD |

【问题讨论】:

  • 您能否重新表述一下这个问题?假设您有多个 ReportData 元素,您想将这些元素作为单独的列返回吗?我的假设是对的吗?
  • 稍微修改了我的问题,希望对您有所帮助
  • 我的有效贡献连一个赞成票都没有? :(

标签: xml tsql


【解决方案1】:

WITH XMLNAMESPACES

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata')
SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)') 
FROM   @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item) 

【讨论】:

  • 再次感谢那些对最终版本感兴趣的人: WITH XMLNAMESPACES(DEFAULT 'ait.com/reportdata') SELECT [ReportId]= reportdata.item.value('./ReportId[1]', ' varchar(40)') , [DocId]= reportdata.item.value('./DocId[1]', 'varchar(40)') FROM @xVar.nodes('/ReportData') 作为报告数据(item)。我希望我能对她的两个答案表示敬意,但不确定你能做到这一点
【解决方案2】:

如果我的假设是正确的,并且您希望在 XML 文档中列出所有 ReportData 元素并将它们的子元素作为不同的列,您可以查看如下内容:

;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata')
SELECT 
    [ReportId] = reportdata.item.value('(./ReportId)[1]', 'varchar(40)') 
  , [DocId] = reportdata.item.value('(./DocId)[1]', 'varchar(40)') 
  , [ReportName] = reportdata.item.value('(./ReportName)[1]', 'varchar(40)') 
  , [DocType] = reportdata.item.value('(./DocType)[1]', 'varchar(40)') 
  , [StatusId] = reportdata.item.value('(./StatusId)[1]', 'varchar(40)') 
  , [AuthorId] = reportdata.item.value('(./AuthorId)[1]', 'varchar(40)') 
FROM @xVar.nodes('//ReportData') AS reportdata(item)

我需要稍微清理一下命名空间声明,但这似乎对我有用...

编辑:使用 Martin 推荐的 WITH XMLNAMESPACES 子句修改了我的答案。 :)

【讨论】:

  • 谢谢,对我也有用。如果我们能摆脱那些讨厌的命名空间语句
  • 我看到有一个 WITH XMLNAMESPACES 语句,但我似乎无法让它工作
  • @user1071785 - 呃,我的回答有一个可行的例子(?)
  • 好的,修改了我的答案,包括 Martin 对 WITH XMLNAMESPACES 子句的建议……希望对你有用!
  • 谢谢,我希望能向你们俩致敬
【解决方案3】:

如果您尝试提取数据并且记录之间的命名空间可能不同,您可以使用通配符作为命名空间前缀。只需在 OP 原始代码的最后一行中的每个元素名称前加上“*:”,如下所示:

FROM   @xVar.nodes('/*:ReportData/*:ReportId[1]') AS reportdata(item) 

请注意,您需要在每个级别都使用通配符,而不仅仅是在您在 xml 中看到命名空间声明的同一级别。这是因为命名空间是由每个级别从其上一级继承而来的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多