दिलचस्प पोस्ट
JQuery AJAX अनुरोध एक पाश में खत्म होने तक इंतजार कैसे करें? मैं AsyncTasks doInBackground () से डेटा कैसे प्राप्त करूं? कैनवास क्यों करता है .डेटाURL () एक सुरक्षा अपवाद फेंकता है? Dijkstra के एल्गोरिथ्म और ए-स्टार की तुलना कैसे होती है? एपेंड बनाम के बीच अंतर पायथन में सूची विधियों का विस्तार एंड्रॉइड खोजदृश्य फ़िल्टर सूची दृश्य एंड्रॉइड: कम मेमोरी पर स्टैटिक वेरिएबल नाल iPhone, यूआईटीextफिल्ड के बाहर छूते हुए कीबोर्ड को खारिज कर देते हैं मैं std :: string को const wchar_t में परिवर्तित करना चाहता हूँ * फ़ाइल या विधानसभा को लोड नहीं किया जा सका PHP के लिए ffmpeg कैसे स्थापित करें "एबीसीडी" क्यों होता है .स्ट्रास्ट्स ("") सच कहां वापस आती हैं? चयनित <option> में <select> element का टेक्स्ट पुनर्प्राप्त करना सी #: डिकोडिंग के लिए क्लास उद्धृत छापने योग्य एन्कोडिंग? रीजेक्स में रिकर्सिव पैटर्न

एसक्यूएल सर्वर में कैसे काम करता है और 'एक्सएमएल पथ' के लिए काम करता है

तालिका है:

+----+------+ | Id | Name | +----+------+ | 1 | aaa | | 1 | bbb | | 1 | ccc | | 1 | ddd | | 1 | eee | +----+------+ 

अपेक्षित आउटपुट:

 +----+---------------------+ | Id | abc | +----+---------------------+ | 1 | aaa,bbb,ccc,ddd,eee | +----+---------------------+ 

प्रश्न:

 SELECT ID, abc = STUFF( (SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, '' ) FROM temp1 GROUP BY id 

यह प्रश्न ठीक से काम कर रहा है लेकिन मुझे यह समझने की आवश्यकता है कि यह कैसे काम करता है या ऐसा करने के लिए कोई अन्य या संक्षिप्त तरीका है।

मुझे यह समझने में बहुत उलझन हो रही है।

वेब के समाधान से एकत्रित समाधान "एसक्यूएल सर्वर में कैसे काम करता है और 'एक्सएमएल पथ' के लिए काम करता है"

यहाँ दिया गया है कि यह कैसे काम करता है:

XML के लिए XML तत्व स्ट्रिंग प्राप्त करें

एक क्वेरी के अंत में XML पथ के लिए जोड़ना आपको क्वेरी के परिणाम को XML तत्वों के रूप में आउटपुट करने की अनुमति देता है, जिसमें PATH तर्क में निहित तत्व नाम है। उदाहरण के लिए, यदि हम निम्नलिखित कथन को चलाने के लिए थे:

 SELECT ',' + name FROM temp1 FOR XML PATH ('') 

रिक्त स्ट्रिंग (XML PATH ('' के लिए) में गुज़रने के द्वारा, हम इसके बजाय निम्नलिखित प्राप्त करते हैं:

 ,aaa,bbb,ccc,ddd,eee 

2. STUFF के साथ प्रमुख अल्पविराम को निकालें

STUFF स्टेटमेंट का अक्षरशः "सामान" एक स्ट्रिंग को दूसरी स्ट्रिंग में बदलता है, पहली स्ट्रिंग में वर्णों को बदलता है। हालांकि, हम मूल्यों की परिणामी सूची के पहले अक्षर को निकालने के लिए बस इसे उपयोग कर रहे हैं।

 SELECT abc = STUFF(( SELECT ',' + NAME FROM temp1 FOR XML PATH('') ), 1, 1, '') FROM temp1 

STUFF मापदंड हैं:

  • स्ट्रिंग "भरवां" (हमारे मामले में एक प्रमुख अल्पविराम के साथ नाम की पूरी सूची)
  • स्थान हटाना और वर्णों को सम्मिलित करना शुरू करने के लिए (1, हम एक रिक्त स्ट्रिंग में भर रहे हैं)
  • हटाने के लिए वर्णों की संख्या (1, अग्रणी अल्पविराम होने के नाते)

तो हम इसके साथ समाप्त होते हैं:

 aaa,bbb,ccc,ddd,eee 

3. पूर्ण सूची प्राप्त करने के लिए आईडी पर जुड़ें

इसके बाद हम इसे अस्थायी तालिका में आईडी की सूची में शामिल कर सकते हैं, नामों के साथ आईडी की सूची प्राप्त करने के लिए:

 SELECT ID, abc = STUFF( (SELECT ',' + name FROM temp1 t1 WHERE t1.id = t2.id FOR XML PATH ('')) , 1, 1, '') from temp1 t2 group by id; 

और हमारे पास हमारा परिणाम है:

 ----------------------------------- | Id | Name | |---------------------------------| | 1 | aaa,bbb,ccc,ddd,eee | ----------------------------------- 

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

यह आलेख एसक्यूएल में कंसेटेनटिंग स्ट्रिंग के विभिन्न तरीकों को शामिल करता है, जिसमें आपके कोड के एक बेहतर संस्करण शामिल हैं, जो कंसटानेटेड मानों को एक्सएमएल-एन्कोड नहीं करता है।

 SELECT ID, abc = STUFF ( ( SELECT ',' + name FROM temp1 As T2 -- You only want to combine rows for a single ID here: WHERE T2.ID = T1.ID ORDER BY name FOR XML PATH (''), TYPE ).value('.', 'varchar(max)') , 1, 1, '') FROM temp1 As T1 GROUP BY id 

क्या हो रहा है यह समझने के लिए, आंतरिक क्वेरी से शुरू करें:

 SELECT ',' + name FROM temp1 As T2 WHERE T2.ID = 42 -- Pick a random ID from the table ORDER BY name FOR XML PATH (''), TYPE 

क्योंकि आप FOR XML निर्दिष्ट कर रहे हैं, आपको एक पंक्ति मिलती है जिसमें सभी पंक्तियों का प्रतिनिधित्व करने वाला एक XML टुकड़ा होगा

क्योंकि आपने पहले कॉलम के लिए कोई स्तंभ उपनाम निर्दिष्ट नहीं किया है, प्रत्येक पंक्ति को FOR XML PATH बाद ब्रैकेट में निर्दिष्ट नाम के साथ XML तत्व में लपेटा जाएगा। उदाहरण के लिए, यदि आपके पास FOR XML PATH ('X') , तो आपको एक ऐसा एक्सएमएल दस्तावेज मिलेगा जो इस तरह दिखता था:

 <X>,aaa</X> <X>,bbb</X> ... 

लेकिन, चूंकि आपने एक तत्व का नाम निर्दिष्ट नहीं किया है, आप केवल मानों की सूची प्राप्त करते हैं:

 ,aaa,bbb,... 

.value('.', 'varchar(max)') केवल XML- एन्कोडिंग के बिना किसी भी "विशेष" वर्णों के परिणामी एक्सएमएल टुकड़े से मूल्य प्राप्त करता है आपके पास अब एक स्ट्रिंग है जो दिखता है:

 ',aaa,bbb,...' 

STUFF फ़ंक्शन तब प्रमुख अल्पविराम को निकाल देता है, जिससे आप अंतिम परिणाम देते हैं जो दिखता है:

 'aaa,bbb,...' 

यह पहली नज़र में काफी भ्रामक दिखता है, लेकिन यह अन्य विकल्पों में से कुछ की तुलना में काफी अच्छा प्रदर्शन करता है।

पैठ मोड का उपयोग एक खोज क्वेरी से एक्सएमएल बनाने में किया जाता है

 1. SELECT ID, Name FROM temp1 FOR XML PATH; Ouput: <row> <ID>1</ID> <Name>aaa</Name> </row> <row> <ID>1</ID> <Name>bbb</Name> </row> <row> <ID>1</ID> <Name>ccc</Name> </row> <row> <ID>1</ID> <Name>ddd</Name> </row> <row> <ID>1</ID> <Name>eee</Name> </row> 

आउन्ट्यूमेंट तत्व-केंद्रित एक्सएमएल है, जिसके परिणामस्वरूप रोचेसेट में प्रत्येक कॉलम का मूल्य एक पंक्ति तत्व में लपेटा हुआ है। चूंकि SELECT खंड कॉलम के नामों के लिए कोई उपनाम निर्दिष्ट नहीं करता है, इसलिए जेनरेट किए गए बच्चे का तत्व नाम समान चयन नाम के कॉलम नामों के समान है।

पंक्ति में प्रत्येक पंक्ति के लिए एक टैग जोड़ा गया है।

 2. SELECT ID, Name FROM temp1 FOR XML PATH(''); Ouput: <ID>1</ID> <Name>aaa</Name> <ID>1</ID> <Name>bbb</Name> <ID>1</ID> <Name>ccc</Name> <ID>1</ID> <Name>ddd</Name> <ID>1</ID> <Name>eee</Name> 

चरण 2 के लिए: यदि आप शून्य-लंबाई स्ट्रिंग निर्दिष्ट करते हैं, तो रैपिंग तत्व का उत्पादन नहीं किया जाता है।

 3. SELECT Name FROM temp1 FOR XML PATH(''); Ouput: <Name>aaa</Name> <Name>bbb</Name> <Name>ccc</Name> <Name>ddd</Name> <Name>eee</Name> 4. SELECT ',' +Name FROM temp1 FOR XML PATH('') Ouput: ,aaa,bbb,ccc,ddd,eee 

चरण 4 में हम मूल्यों को सम्मिलित कर रहे हैं।

 5. SELECT ID, abc = (SELECT ',' +Name FROM temp1 FOR XML PATH('') ) FROM temp1 Ouput: 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 1 ,aaa,bbb,ccc,ddd,eee 6. SELECT ID, abc = (SELECT ',' +Name FROM temp1 FOR XML PATH('') ) FROM temp1 GROUP by iD Ouput: ID abc 1 ,aaa,bbb,ccc,ddd,eee 

चरण 6 में हम आईडी द्वारा दिनांक को समूह बना रहे हैं।

STUFF (स्रोत_स्ट्रिंग, प्रारंभ, लंबाई, ऐड_स्ट्रिंग) पैरामीटर या तर्क स्रोत_स्ट्रिंग संशोधित करने के लिए स्रोत स्ट्रिंग start_string में स्थिति लंबाई अक्षरों को हटाने के लिए और फिर add_string डालें लंबाई स्रोत_स्ट्रिंग से हटाने के लिए वर्णों की संख्या add_string प्रारंभ स्थिति में स्रोत_स्ट्रिंग में डालने के लिए वर्णों का क्रम।

 SELECT ID, abc = STUFF ( (SELECT ',' +Name FROM temp1 FOR XML PATH('')), 1, 1, '' ) FROM temp1 GROUP by iD Output: ----------------------------------- | Id | Name | |---------------------------------| | 1 | aaa,bbb,ccc,ddd,eee | ----------------------------------- 

इस सटीक परिदृश्य को संभालने के लिए Azure SQL डेटाबेस और SQL सर्वर (2017 से शुरू) में बहुत नई कार्यक्षमता है मेरा मानना ​​है कि यह आपको XML / STUFF विधि के साथ पूरा करने का प्रयास करने के लिए एक देशी आधिकारिक पद्धति के रूप में काम करेगा। उदाहरण:

 select id, STRING_AGG(name, ',') as abc from temp1 group by id 

STRING_AGG – https://msdn.microsoft.com/en-us/library/mt790580.aspx

संपादित करें: जब मैंने मूल रूप से पोस्ट किया तो मैंने SQL Server 2016 का उल्लेख किया जैसा कि मैंने सोचा था कि मैंने उस संभावित सुविधा पर शामिल किया था। या तो मुझे याद आया कि गलत तरीके से या कुछ बदल गया, संस्करण को ठीक करने के लिए सुझाए गए संपादन के लिए धन्यवाद। इसके अलावा, बहुत प्रभावित और बहु-स्तरीय समीक्षा प्रक्रिया के बारे में पूरी तरह से अवगत नहीं था, जिसने मुझे अंतिम विकल्प के लिए खींच लिया।

Xml पथ के लिए यदि हम किसी भी मान को परिभाषित करते हैं जैसे [xml पथ ('ENVLOPE')] तो

उपरोक्त टैग प्रत्येक पंक्ति के साथ जोड़ दिए जाएंगे।

 Declare @Temp As Table (Id Int,Name Varchar(100)) Insert Into @Temp values(1,'A'),(1,'B'),(1,'C'),(2,'D'),(2,'E'),(3,'F'),(3,'G'),(3,'H'),(4,'I'),(5,'J'),(5,'K') Select X.ID, stuff((Select ','+ Z.Name from @Temp Z Where X.Id =Z.Id For XML Path('')),1,1,'') from @Temp X Group by X.ID 
 SELECT ID, abc = STUFF( (SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, '' ) FROM temp1 GROUP BY id 

यहां उपर्युक्त क्वेरी में स्ट्रॉफ फंक्शन का इस्तेमाल केवल एक्सएमआई स्ट्रिंग (,aaa,bbb,ccc,ddd,eee) से पहला कॉमा (,) को हटाने के लिए किया जाता है (,aaa,bbb,ccc,ddd,eee) तो यह (aaa,bbb,ccc,ddd,eee)

और FOR XML PATH('') कॉलम डेटा को (,aaa,bbb,ccc,ddd,eee) स्ट्रिंग में परिवर्तित कर दिया जाता है (,aaa,bbb,ccc,ddd,eee) लेकिन पैथ में हम '' गुजर रहे हैं इसलिए यह एक XML टैग नहीं बनायेगा

और अंत में हमने आईडी कॉलम का उपयोग करते हुए रिकॉर्ड समूहीकृत किए हैं।

मैंने डिबगिंग किया और आखिरकार मेरी 'स्टफ़ेड' क्वेरी को मेरे पास वापस लाया, यह सामान्य तरीका है।

केवल

 select * from myTable for xml path('myTable') 

मुझे एक ट्रिगर आई डीबग से लॉग टेबल पर लिखने के लिए तालिका की सामग्री देता है I