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

SQL Server在指定默认值时创建XML命名空间,sql,sql-server,xml,xquery,xquery-sql,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) 最初查询XML时,在选择中声明默认元素名称空间,所有元素将使用默认名称空间声明而不是前缀

举个简单的例子:

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)

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

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)
declare@myXml
set@myXML=
';    
使用xmlnamespaces(默认为“urn:somename”)
选择t.c.query('
声明默认元素名称空间“urn:somename”;
.')
来自@myXml.nodes('/root/line')t(c)
=>



我认为您需要在XQuery语句中声明默认的元素名称空间,正如文章在B中所建议的那样。@wst无论使用xmlnamespaces语法还是declare语句,我都会得到完全相同的症状。您是否尝试在
select
语句中声明默认名称空间?@wst在select语句中?我不知道你这是什么意思。我尝试了上面显示的“with xmlnamespaces”语法,并在nodes()调用中添加了声明,这两种方法都提供了相同的结果。从“这段XML包含哪些数据”的角度来看,
urn:somename
的默认名称空间中包含完全相同的数据。担心确切的字符串格式通常是其他地方脆弱性的标志(例如使用手动解析而不是使用适当的XML库的其他代码段)
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:line xmlns:p1="urn:somename" id="1" />
select t.c.query('.')
from @myXml.nodes('declare default element namespace "urn:somename";/root/line') t(c)
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" />