SQL Server 在指定默认值时创建 XML 命名空间

标签 sql sql-server xml xquery xquery-sql

举个简单的例子:

declare @myXml xml
set @myXML = '
<root>
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>'
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)

正如预期的那样,我返回了三行,如下所示:

<line id="1" />

但是,当 XML 声明其命名空间时(即使只是默认的 xmlns),您还需要在 SQL 中指定该命名空间,否则您的结果集将变为空。我知道两种方法:在 nodes() 方法调用中使用 declare 语句,或者使用 with xmlnamespaces 语句。让我们使用后者:

declare @myXml xml
set @myXML = '
<root xmlns="urn:somename">
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>';

with xmlnamespaces(default 'urn:somename')
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)

虽然我现在得到了结果,但结果中肯定有一些奇怪之处。指定的命名空间被添加为“p1”而不是默认的。所以我的输出看起来像这样:

<p1:line xmlns:p1="urn:somename" id="1" />

this Technet article , B 部分。声明一个默认命名空间 显示了我试图实现的目标,但我得到的结果显示在 D 中。使用默认 namespace 构建。由于我的示例看起来不太像后者,所以我不明白为什么我会得到这些前缀。

更新: 为了完整起见,这给出了与 with xmlnamespaces 语法完全相同的症状:

select t.c.query('.')
from @myXml.nodes('declare default element namespace "urn:somename";/root/line') t(c)

最佳答案

当您最初查询 XML 时,在 select 中声明默认元素命名空间,所有元素将使用默认命名空间声明而不是前缀:

declare @myXml xml
set @myXML = '
<root xmlns="urn:somename">
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>';    
with xmlnamespaces(default 'urn:somename')
select t.c.query('
  declare default element namespace "urn:somename";
  .')
from @myXml.nodes('/root/line') t(c)

=>

<line xmlns="urn:somename" id="1" />
<line xmlns="urn:somename" id="2" />
<line xmlns="urn:somename" id="3" />

关于SQL Server 在指定默认值时创建 XML 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19637253/

相关文章:

sql - 在复杂的 mysql 分页查询逻辑方面需要帮助

sql - 在不知道父行是什么的情况下,删除父行时删除子行的最简单方法是什么?

php - 在 PHP 中从 XML 中获取属性

SQL - 按唯一列集分组

Java解析带有附加数据的xml文件

java - 为每个请求加载 XML

mysql - 使用 substring_index MySQL 获取带有破折号的名称

sql - 忽略特定列中的相同值

mysql - 是否需要为所有重复的数据创建一个表?

sql-server - 在镜像构建时将种子数据添加到基于Docker的Microsoft SQL Server