2008-10-27 20 views
5

इस एक्सएमएल के लिए में एक तत्व की विशेषताओं के नाम जाओ (एक एसक्यूएल 2005 एक्सएमएल कॉलम में):किसी SQL एक्सएमएल स्तंभ

<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
<doc> 

मैं विशेषताओं के नाम को पुनः प्राप्त करने में सक्षम होना चाहते हैं (बीए, बीबी, बीसी, बीडी) एसक्यूएल सर्वर 2005 के अंदर मानों के बजाय। खैर, XPath निश्चित रूप से इसे नाम() के साथ अनुमति देता है लेकिन एसक्यूएल इसका समर्थन नहीं करता है। एसक्यूएल में एक्सएमएल का उपयोग करने के साथ यह मेरी मुख्य शिकायत है; आपको यह पता लगाना होगा कि एक्सएमएल/एक्सपैथ/एक्सक्वियर स्पेक के कौन से हिस्से वहां हैं।

एक ऐसा तरीका जिसे मैं ऐसा करने के बारे में सोच सकता हूं वह एक सीएलआर प्रोसेस बनाना है जो XML को XML दस्तावेज़ (iirc) में लोड करता है और नोड्स के नाम निकालने के लिए XPath चलाता है। मैं यहां सुझावों के लिए खुला हूं।

+1

एक वोट दें वाह, यह मिल गया ** 7.5 साल ** के बाद मैं इसे पूछा। – jcollum

उत्तर

4
DECLARE @xml as xml 
DECLARE @path as varchar(max) 
DECLARE @index int, @count int 

SET @xml = 
'<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
</doc>' 



SELECT @index = 1 

SET @count = @xml.query('count(/doc/b/@*)').value('.','int') 

WHILE @index <= @count 
BEGIN 
    SELECT @xml.value('local-name((/doc/b/@*[sql:variable("@index")])[1])', 'varchar(max)') 
    SET @index = @index + 1 
END 
तत्व 'बी'

यह रिटर्न

  • बा
  • bb
  • बीसी

आप एक पाश निर्माण कर सकते हैं प्रत्येक तत्व के लिए गुण प्राप्त करने के लिए

एक्सएमएल में

बीटीडब्ल्यू आपके नमूने में एक्सएमएल बंद दस्तावेज़ टैग पर बंद होना चाहिए।

+0

मैंने सोचा कि यह नहीं किया जा सका। धन्यवाद! – jcollum

3

इस:

declare @xml as xml 

set @xml = 
'<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
</doc>' 

select @xml.query(' 
    for $attr in /doc/b/@* 
    return local-name($attr)') 

रिटर्न:

बा bb बीसी

6
DECLARE @xml as xml 

SET @xml = 
'<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
</doc>' 

SELECT DISTINCT 
CAST(Attribute.Name.query('local-name(.)') AS VARCHAR(100)) Attribute, 
Attribute.Name.value('.','VARCHAR(100)') Value 
FROM @xml.nodes('//@*') Attribute(Name) 

रिटर्न:

विशेषता मान

बा 1

bb 2

बीसी 3

bd 3

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