无名称空间的XQuery插入SQL2008
问题描述:
<game xmlns="http://my.name.space" ></game>
这是我的根元素。我已经写了一个存储过程来插入元素。综上所述存储过程,这里的SQL无名称空间的XQuery插入SQL2008
UPDATE ChessGame SET GameHistory.modify('insert <move><player>black</player><piece>pawn</piece><start>E7</start><end>E6</end></move> as last into (/game)[0]') WHERE Id = @GameId;
现在,当MSSQL确实插入一个空的命名空间也被插入这样的结果是这样的
<move xmlns="">
<player>black</player>
<piece>king</piece>
<start>E7</start>
<end>E6</end>
</move>
现在我同时使用
尝试WITH XMLNAMESPACES(DEFAULT 'http://my.name.space')
和
GameHistory.modify('declare default element namespace "http://my.name.space"; insert ...')
但是我最终得到了各处的前缀和每个元素的名称空间声明。
代码库中出现的问题缺乏处理MSSQL放入的前缀的逻辑。最后,我只是想将一个新元素插入到我的xml根目录并将名称空间留空(使用根目录默认值?)。我都很新,但据我了解,如果我在根元素中有一个命名空间,是否所有的孩子节点都不应该有一个默认的根空间?
答
declare @x xml;
select @x='<game xmlns="http://my.name.space" ></game>';
set @x.modify('declare default element namespace "http://my.name.space";
insert <move><player>black</player><piece>pawn</piece>
<start>E7</start><end>E6</end></move> as last into (/game)[1]');
select @x;
这将产生:
<game xmlns="http://my.name.space">
<move>
<player>black</player>
<piece>pawn</piece>
<start>E7</start>
<end>E6</end>
</move>
</game>
两个SQL 2005 SP2和SQL 2008 SP1。
而且此表的更新工作正常:
declare @t table (x xml);
insert into @t (x) values ('<game xmlns="http://my.name.space" ></game>');
update @t
set x.modify('declare default element namespace "http://my.name.space";
insert <move><player>black</player><piece>pawn</piece>
<start>E7</start><end>E6</end></move> as last into (/game)[1]');
select * from @t;
答
OK,这个工作对我来说:
帖子的DECLARE @x XML;
SET @x = '<game xmlns="http://my.name.space" ></game>';
select @x
SET @x.modify(
' declare default element namespace "http://my.name.space";
insert <move><player>black</player><piece>pawn</piece><start>E7</start><end>E6</end></move> as last into (/*:game)[1]'
)
select @x
都工作100% 我发现是,虽然打破我的问题。 作为最后进入(/游戏)[0]应该作为最后进入(/游戏)[1] 不是[0]代表第一个项目的发生?就像一个基于零的数组? – Matt 2009-09-04 20:28:54
@RBarry:你为什么更喜欢'/ *:node'?这是否意味着'具有*任何*名称空间的游戏节点'? – 2009-09-04 20:41:32
马特:不,是序数:[1]是第一个例子。 – RBarryYoung 2009-09-04 22:59:37