2009-09-04 7 views
5
<game xmlns="http://my.name.space" ></game> 

これはルート要素です。私はそれに要素を挿入するストアドプロシージャを記述しました。結果は、今私は両方名前空間のないXQuery挿入SQL2008

を使用してみました。この

<move xmlns=""> 
    <player>black</player> 
    <piece>king</piece> 
    <start>E7</start> 
    <end>E6</end> 
</move> 

あるので、MSSQLは、インサートは、空の名前空間にも挿入されないときに、ストアドプロシージャを要約すると、ここではSQL

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; 

は今です

WITH XMLNAMESPACES(DEFAULT 'http://my.name.space') 

GameHistory.modify('declare default element namespace "http://my.name.space"; insert ...') 

しかし、私はすべての接頭辞と各要素の名前空間宣言で終わる。

MSSQLが置くプレフィックスを処理するロジックがないコードライブラリで問題が発生します。最後に、xmlルートに新しい要素を挿入し、名前空間を空白のままにします(ルートデフォルトを使用しますか?)。私はすべてこれに非常に新しいですが、私はそれを理解すると、私は私のルート要素に名前空間がある場合、すべての子ノードは私のルートのデフォルトの名前空間を持っていないはずですか?

答えて

2
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; 
3

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% を働きます。 最後に(/ game)[0]は最後にする必要があります(/ game)[1] [0]は最初のアイテムの出現を表していませんか?ゼロベースの配列とほとんど同じですか? – Matt

+1

@RBarry:なぜあなたは '/ *:node'を好むのですか? * '*任意の*名前空間を持つゲームノード'を意味しますか? –

+0

マット:いいえ、序数:[1]が最初のインスタンスです。 – RBarryYoung