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

यह मेरा मूल तत्व है। मैंने तत्वों को सम्मिलित करने के लिए एक संग्रहित प्रक्रिया लिखी है। संग्रहीत प्रक्रिया सारांश में, यहाँ एसक्यूएलXQuery नामस्थान के बिना सम्मिलित करें 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; 

अब तो परिणाम यह

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

अब मैं दोनों

का उपयोग कर की कोशिश की है जब MSSQL डालने एक खाली नाम स्थान भी डाला जाता है करता है
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> 
दोनों एसक्यूएल 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

ठीक है, यह मेरे लिए काम करता है:

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% काम मैं मुद्दा यह है कि मेरा हालांकि टूट रहा है मिल गया। आखिरी (/ गेम) [0] में आखिरी (/ गेम) [1] क्या [0] पहली वस्तु घटना का प्रतिनिधित्व नहीं करता है? शून्य-आधारित सरणी की तरह? – Matt

+1

@RBarry: आप '/ *: नोड' क्यों पसंद करते हैं? क्या इसका मतलब है 'किसी भी * नेमस्पेस' के साथ गेम नोड? –

+0

मैट: नहीं, औपचारिक है: [1] पहला उदाहरण है। – RBarryYoung

संबंधित मुद्दे