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

Questo è il mio elemento principale. Ho scritto una procedura memorizzata per inserire elementi in essa. Per riassumere la stored procedure, ecco la SQLInserimento XQuery senza spazio dei nomi 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; 

Ora, quando MSSQL fa l'inserto è inserito anche uno spazio dei nomi vuoto in modo che il risultato è questo

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

Ora ho provato utilizzando sia

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

e

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

Ma finisco dapprima con prefissi e una dichiarazione di namespace per ogni elemento.

I problemi sorgono in librerie di codice che mancano di logica per gestire i prefissi MSSQL mette in. Alla fine voglio solo inserire un nuovo elemento nella mia radice xml e lasciare lo spazio dei nomi vuoto (utilizzare il default di root?). Sono tutto molto nuovo a questo ma, a quanto ho capito, se ho un namespace nel mio elemento root, non tutti i childnode dovrebbero avere uno spazio dei nomi predefinito della mia root?

risposta

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; 

Questo produce:

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

sia su SQL 2005 SP2 e SQL 2008 SP1.

Anche questo aggiornamento tavolo funziona bene:

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, questo funziona per me:

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

Entrambi i tuoi messaggi lavorare al 100% ho trovato il problema che sta rompendo la mia però. come ultimo in (/ gioco) [0] dovrebbe essere l'ultimo in (/ gioco) [1] Non il [0] rappresenta la prima occorrenza di un elemento? Molto simile a un array a base zero? – Matt

+1

@RBarry: perché preferisci '/ *: node'? Significa "nodo di gioco con * qualsiasi * spazio dei nomi"? –

+0

Matt: No, è ordinale: [1] è la prima istanza. – RBarryYoung

Problemi correlati