2015-05-16 8 views
7

कृपया नीचे DDL देखें:एसटीयूएफएफ एक्सएमएल क्यों हटाता है?

create table #Test (id int,Name varchar(30)) 

insert into #Test values (1,'Ian') 
insert into #Test values(1,'Mark') 
insert into #Test values(2,'James') 
insert into #Test values(3,'Karen') 
insert into #Test values(3,'Suzie') 

और नीचे एसक्यूएल:

select * from #Test for xml path('') 

जो रिटर्न:

<id>1</id> 
<Name>Ian</Name> 
<id>1</id> 
<Name>Mark</Name> 
<id>2</id> 
<Name>James</Name> 
<id>3</id> 
<Name>Karen</Name> 
<id>3</id> 
<Name>Suzie</Name> 

यह मैं क्या उम्मीद करेंगे है।

SELECT distinct ID, 
STUFF((select ','+ NAME from #Test as #Test1 where #Test1.id=#Test2.id FOR XML PATH('')),1,1,'') FROM #Test as #Test2 

जो रिटर्न:

1 Ian,Mark 
2 James 
3 Karen,Suzie 

यही तो मैं वापस आ चाहते हैं अब नीचे एसक्यूएल देखें। हालांकि, एक्सएमएल तत्व कहां गए हैं?

उत्तर

1

यह STUFF नहीं है, यह केवल पहले , पर अनावश्यक को हटाने के लिए है।

concat एक्सएमएल सामान निकालता है:

','+ NAME 
or 
NAME + '' 

कारण है कि यह इस तरह से काम कर रहा है, शायद इसे कहीं :-)

1

इनर एक्सएमएल बयान के लिए दस्तावेज़ीकरण किया गया है है मुझे मत पूछो बस श्रृंखलाबद्ध परिणाम के उत्पादन के लिए है । एक्सएमएल बयान के लिए बाहरी जोड़ें:

SELECT distinct ID, 
    STUFF((select ','+ NAME 
      from Test as #Test1 
      where #Test1.id=#Test2.id 
      FOR XML PATH('')),1,1,'') as Names 
FROM Test as #Test2 
FOR XML PATH('') 

आउटपुट:

<ID>1</ID><Names>Ian,Mark</Names><ID>2</ID><Names>James</Names><ID>3</ID><Names>Karen,Suzie</Names> 

फिडल http://sqlfiddle.com/#!6/5f254/13

1

आप सेब के लिए सेब की तुलना करने के लिए है। यह सच है जबकि उस

select * from #Test for xml path('') 

कुछ है कि एक्सएमएल तरह लग रहा है पैदा करता है (लेकिन तकनीकी रूप से नहीं है क्योंकि यह एक मूल तत्व नहीं है) इस (जो आप असल चला रहे हैं)

select ',' + name from #Test for xml path('') 

, ऐसा नहीं करता। मेरी मशीन पर, यह एफएफ स्ट्रिंग का उत्पादन करता है: ", इयान, मार्क, जेम्स, करेन, सूजी"। वहां से, सामान फ़ंक्शन पहले कॉमा पर जोर देता है और आपको अल्पविराम से अलग मूल्यों की एक सूची मिलती है।

1

क्यों STUFF एक्सएमएल को दूर करता है?

STUFF स्ट्रिंग में पहले कॉमा को हटा देता है, यह XML तत्व नामों को हटाने के लिए ज़िम्मेदार नहीं है।

FOR XML PATH XML तत्व नाम बनाने के लिए स्तंभ नाम का उपयोग करता है। जब आप दो मानों को एक साथ जोड़ते हैं ','+ NAME परिणामी कॉलम का कोई नाम नहीं है तो FOR XML PATH आपके लिए तत्व नाम उत्पन्न नहीं कर सकता है।

व्यवहार Columns without a Name में प्रलेखित है।

नाम के बिना किसी भी कॉलम को रेखांकित किया जाएगा। उदाहरण के लिए, गणना कॉलम या नेस्टेड स्केलर क्वेरी जो कॉलम उपनाम निर्दिष्ट नहीं करते हैं किसी भी नाम के बिना कॉलम उत्पन्न करेंगे।

+0

यह इस बारे में मैंने पढ़ा है सबसे महत्वपूर्ण चीजों में से एक है। यह साबित करता है कि कोड वास्तव में एक हैक है और शायद भविष्य में रिलीज में भरोसा नहीं किया जा सकता है। यह सही जवाब है। – Paul

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