这是对 T-Sql xml 查询的后续问题如果我向 xml 数据添加命名空间,则不会再返回任何内容。DECLARE @xVar XMLSET @xVar = '
这是一个后续问题
T-Sql xml 查询
如果我向 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 |
如果我的假设是正确的,并且您想要列出 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 子句修改了我的答案。:)