अन्य वर्तमान उत्तर इस बारे में बहुत कुछ नहीं बताते हैं कि यह कहां से आ रहा है, या केवल खराब स्वरूपित साइटों के लिंक प्रदान करते हैं और वास्तव में प्रश्न का उत्तर नहीं देते हैं।
स्ट्रिंग्स को समूहीकृत करने के लिए वेब पर कई उत्तरों में कॉपी पेस्ट के उत्तर होते हैं, जो कि क्या हो रहा है, इसकी बहुत अधिक व्याख्या किए बिना। मैं इस प्रश्न का बेहतर उत्तर देना चाहता था क्योंकि मैं भी यही सोच रहा था, और वास्तव में समग्र रूप से क्या हो रहा है, इसकी जानकारी देना चाहता था।
tldr;
संक्षेप में, यह FOR XML PATH
. का उपयोग करते समय XML आउटपुट को रूपांतरित करने में मदद करने के लिए सिंटैक्स है जो आउटपुट को संरचित करने के लिए कॉलम नाम (या उपनाम) का उपयोग करता है। अगर आप अपने कॉलम को text()
. नाम देते हैं डेटा को रूट टैग के भीतर टेक्स्ट के रूप में दर्शाया जाएगा।
<row>
My record's data
<row>
उदाहरणों में आप ,
. के साथ स्ट्रिंग्स और कॉनकैट को समूहबद्ध करने के लिए ऑनलाइन देखते हैं यह स्पष्ट नहीं हो सकता है (इस तथ्य को छोड़कर कि आपकी क्वेरी में इतना छोटा for xml
. है भाग) कि आप वास्तव में एक विशिष्ट संरचना (या बल्कि, संरचना की कमी) के साथ एक XML फ़ाइल का निर्माण कर रहे हैं FOR XML PATH ('')
का उपयोग करके . ('')
रूट xml टैग को हटा रहा है, और केवल डेटा को थूक रहा है।
AS [text()]
. के साथ डील
हमेशा की तरह, AS
कॉलम उपनाम का नाम या नाम बदलने के लिए कार्य कर रहा है। इस उदाहरण में, आप इस कॉलम को [text()]
. के रूप में अलियासिंग कर रहे हैं . []
s केवल SQL सर्वर के मानक स्तंभ सीमांकक हैं, जो अक्सर अनावश्यक होते हैं, आज को छोड़कर क्योंकि हमारे स्तंभ नाम में ()
है एस। यह हमें text()
. के साथ छोड़ देता है हमारे कॉलम नाम के लिए।
स्तंभ नामों के साथ XML संरचना को नियंत्रित करना
जब आप FOR XML PATH
. का उपयोग कर रहे हों आप एक एक्सएमएल फ़ाइल आउटपुट कर रहे हैं और अपने कॉलम नामों से संरचना को नियंत्रित कर सकते हैं। विकल्पों की एक विस्तृत सूची यहां पाई जा सकती है:https://msdn.microsoft .com/en-us/library/ms189885.aspx
एक उदाहरण में आपके कॉलम का नाम @ चिह्न से शुरू करना शामिल है, जैसे:
SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH
यह इस कॉलम के डेटा को वर्तमान xml पंक्ति की विशेषता में ले जाएगा, जैसा कि इसके भीतर किसी आइटम के विपरीत है। आप
. के साथ समाप्त होते हैं<row color="red">
<name>tim</name>
</row>
<row color="blue">
<name>that guy</name>
</row>
तो फिर, [text()]
पर वापस जाएं . यह वास्तव में एक XPath नोड परीक्षण
निर्दिष्ट कर रहा है। . MS Sql सर्वर के संदर्भ में, आप इस पद के बारे में जान सकते हैं यहां
ए> . मूल रूप से यह उस तत्व के प्रकार को निर्धारित करने में मदद करता है जिसमें हम इस डेटा को जोड़ रहे हैं, जैसे सामान्य नोड (डिफ़ॉल्ट), एक एक्सएमएल टिप्पणी, या इस उदाहरण में, टैग के भीतर कुछ टेक्स्ट।
आउटपुट को संरचित करने के लिए कुछ चालों का उपयोग करते हुए एक उदाहरण
SELECT
color as [@color]
,'Some info about ' + name AS [text()]
,name + ' likes ' + color AS [comment()]
,name
,name + ' has some ' + color + ' things' AS [info/text()]
FROM #favorite_colors
FOR XML PATH
ध्यान दें कि हम अपने कॉलम नामों में कुछ पदनामों का उपयोग कर रहे हैं:
@color
:एक टैग विशेषताtext()
:इस रूट टैग के लिए कुछ टेक्स्टcomment()
:एक एक्सएमएल टिप्पणीinfo/text()
:एक विशिष्ट xml टैग में कुछ पाठ,<info>
आउटपुट इस तरह दिखता है:
<row color="red">
Some info about tim
<!--tim likes red-->
<name>tim</name>
<info>tim has some red things</info>
</row>
<row color="blue">
Some info about that guy
<!--that guy likes blue-->
<name>that guy</name>
<info>that guy has some blue things</info>
</row>
इसे समेटते हुए, ये टूल कैसे समूह और कॉनकैट स्ट्रिंग्स कर सकते हैं?
इसलिए, समाधानों के साथ हम FOR XML PATH
. का उपयोग करके स्ट्रिंग्स को एक साथ समूहीकृत करने के लिए देखते हैं , दो प्रमुख घटक हैं।
AS [text()]
:डेटा को टैग में लपेटने के बजाय टेक्स्ट के रूप में लिखता हैFOR XML PATH ('')
:रूट टैग का नाम बदलकर''
. कर दें , या यों कहें, इसे पूरी तरह से हटा देता है
यह हमें "XML" (एयर कोट्स) आउटपुट देता है जो अनिवार्य रूप से सिर्फ एक स्ट्रिंग है।
SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('') -- no root tag
रिटर्न
tim, that guy,
वहां से, उस डेटा को वापस उस बड़े डेटासेट में शामिल करने की बात है, जहां से वह आया था।