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

To jest mój główny element. Napisałem procedurę przechowywaną, aby wstawić do niej elementy. Podsumowując procedurę przechowywaną, oto SQLXQuery Wstaw bez przestrzeni nazw 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; 

Teraz kiedy MSSQL ma wkładkę pusta przestrzeń nazw jest także wstawiony więc wynik jest ten

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

Teraz Próbowałem przy użyciu zarówno

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

i

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

Ale kończę z prefiksami wszędzie i deklaracją przestrzeni nazw dla każdego elementu.

Problemy pojawiają się w bibliotekach kodu, które nie mają logiki, aby obsłużyć prefiksy, które wprowadza MSSQL. Na koniec chcę tylko wstawić nowy element do mojego xml root i pozostawić pustą przestrzeń nazw (użyj domyślnego katalogu głównego?). Jestem bardzo nowy w tym, ale jak rozumiem, jeśli mam obszar nazw w moim głównym elementem, czy nie wszystkie childnodes mają domyślny obszar nazw mojego katalogu głównego?

Odpowiedz

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; 

ta produkuje:

<game xmlns="http://my.name.space"> 
    <move> 
    <player>black</player> 
    <piece>pawn</piece> 
    <start>E7</start> 
    <end>E6</end> 
    </move> 
</game> 

zarówno SP2 SQL 2005 i SQL Server 2008 SP1.

Ponadto aktualizacja ta tabela działa poprawnie:

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, to działa na mnie:

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

Zarówno swoich stanowisk pracy 100% znalazłem problem, który łamie kopalni chociaż. jako ostatnia do (/ gra) [0] powinna być ostatnia do (/ gra) [1] Czy [0] nie reprezentuje pierwszego wystąpienia? Podobnie jak w przypadku tablicy zerowej? – Matt

+1

@RBarry: dlaczego wolisz '/ *: node'? Czy to oznacza "węzeł gry z * dowolną * przestrzenią nazw"? –

+0

Matt: Nie, jest porządkowa: [1] jest pierwszą instancją. – RBarryYoung

Powiązane problemy