Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में XML पथ के लिए और [पाठ ()]

अन्य वर्तमान उत्तर इस बारे में बहुत कुछ नहीं बताते हैं कि यह कहां से आ रहा है, या केवल खराब स्वरूपित साइटों के लिंक प्रदान करते हैं और वास्तव में प्रश्न का उत्तर नहीं देते हैं।

स्ट्रिंग्स को समूहीकृत करने के लिए वेब पर कई उत्तरों में कॉपी पेस्ट के उत्तर होते हैं, जो कि क्या हो रहा है, इसकी बहुत अधिक व्याख्या किए बिना। मैं इस प्रश्न का बेहतर उत्तर देना चाहता था क्योंकि मैं भी यही सोच रहा था, और वास्तव में समग्र रूप से क्या हो रहा है, इसकी जानकारी देना चाहता था।

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, 

वहां से, उस डेटा को वापस उस बड़े डेटासेट में शामिल करने की बात है, जहां से वह आया था।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल सर्वर में पूर्णांक विभाजन

  2. SQL परिणाम सेट को स्थानांतरित करें

  3. मैं अनुक्रमित दृश्य पर स्थानिक अनुक्रमणिका कैसे बना सकता हूं?

  4. .NET/SQL में पैरामीटर तालिका का नाम?

  5. MSSQL पर GROUP_CONCAT फ़ंक्शन का उपयोग कैसे करें