5
<game xmlns="http://my.name.space" ></game>  

これが私のルート要素です。要素を挿入するためのストアドプロシージャを作成しました。ストアドプロシージャを要約すると、次の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;

これで、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ルートに新しい要素を挿入し、名前空間を空白のままにします(ルートのデフォルトを使用しますか?)。私はこれにまったく慣れていませんが、理解しているように、ルート要素に名前空間がある場合、すべての子ノードにルートのデフォルトの名前空間を含めるべきではありませんか?

4

2 に答える 2

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
于 2009-09-04T19:25:45.193 に答える
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>

SQL2005SP2とSQL2008SP1の両方で。

また、このテーブルの更新は正常に機能します。

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;
于 2009-09-04T19:17:57.783 に答える