Muf*_*lix 3 xml sql-server sql-server-2008-r2
我可以查询 XML,它定义了带有公共表表达式的xmlns标记
DECLARE @XML XML
SET @XML =
'<NodeA xmlns="https://XYZ.xsd">
<NodeB verzePis="">
<NodeC1 attrA="Hello" />
<NodeC2 attrA="World" />
</NodeB>
</NodeA>
'
;WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')
SELECT
r.value('fn:local-name(.)', 'nvarchar(50)') as SectionName,
r.value('@attrA','NVARCHAR(250)') attrA
FROM @XML.nodes('/NodeA/NodeB/*') AS t(r);
Run Code Online (Sandbox Code Playgroud)
但是如果源 XML 不包含任何 xmlns 标记呢?如何解决缺少命名空间的问题?
您可以删除该WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')
部分:
DECLARE @XML XML
SET @XML =
'<NodeA>
<NodeB verzePis="">
<NodeC1 attrA="Hello" />
<NodeC2 attrA="World" />
</NodeB>
</NodeA>
'
;--WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')
SELECT
r.value('fn:local-name(.)', 'nvarchar(50)') as SectionName,
r.value('@attrA','NVARCHAR(250)') attrA
FROM @XML.nodes('/NodeA/NodeB/*') AS t(r);
Run Code Online (Sandbox Code Playgroud)
产生
+-------------+-------+
| SectionName | attrA |
+-------------+-------+
| NodeC1 | Hello |
| NodeC2 | World |
+-------------+-------+
Run Code Online (Sandbox Code Playgroud)
请注意,WITH XMLNAMESPACES
不会创建公共表表达式,它只是声明了一个可选的命名空间