无名称空间的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 
+0

都工作100% 我发现是,虽然打破我的问题。 作为最后进入(/游戏)[0]应该作为最后进入(/游戏)[1] 不是[0]代表第一个项目的发生?就像一个基于零的数组? – Matt 2009-09-04 20:28:54

+1

@RBarry:你为什么更喜欢'/ *:node'?这是否意味着'具有*任何*名称空间的游戏节点'? – 2009-09-04 20:41:32

+0

马特:不,是序数:[1]是第一个例子。 – RBarryYoung 2009-09-04 22:59:37