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

Dies ist mein Stammelement. Ich habe eine gespeicherte Prozedur geschrieben, um Elemente einzufügen. Um die gespeicherte Prozedur zusammenzufassen, hier ist die SQLXQuery Einfügen ohne Namespace 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; 

Nun, wenn MSSQL hat der Einsatz einen leeren Namensraum auch eingesetzt wird, so das Ergebnis ist das

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

Jetzt habe ich versucht, mit beiden

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

und

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

Aber ich habe überall Präfixe und eine Namespace Deklaration für jedes Element.

Probleme entstehen in Code-Bibliotheken, die Logik fehlt, um die Präfixe MSSQL setzt. Am Ende möchte ich nur ein neues Element in meine Xml-Root einfügen und den Namespace leer lassen (verwenden Sie die Grundeinstellung?). Ich bin alle sehr neu, aber wie ich es verstehe, wenn ich einen Namespace in meinem Root-Element habe, sollten nicht alle Childnodes einen Standard-Namespace meiner Wurzel haben?

Antwort

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; 

Dies erzeugt:

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

sowohl auf SQL 2005 SP2 und SQL 2008 SP1.

Auch diese Tabelle Update funktioniert:

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, das funktioniert für mich:

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

Beide Ihrer Beiträge arbeiten 100% ich das Problem gefunden, obwohl bricht mir. als letzte in (/ Spiel) [0] sollte als letzte sein in (/ Spiel) [1] Steht nicht die [0] das erste Element Vorkommen? Ähnlich wie ein nullbasiertes Array? – Matt

+1

@RBarry: Warum bevorzugen Sie '/ *: node'? Heißt das "Spielknoten mit * any * namespace"? –

+0

Matt: Nein, ist ordinal: [1] ist die erste Instanz. – RBarryYoung