select ET1.EntryID,
(
select ', '+T.Name
from Tags as T
inner join EntryTag as ET2
on T.TagID = ET2.TagID
where ET1.EntryID = ET2.EntryID
for xml path(''), type
).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID
क्वेरी को अलग करना
मुख्य क्वेरी एक group by
. करती है इसलिए आपको प्रत्येक EntryID
. के लिए केवल एक पंक्ति मिलती है ।
कॉलम TagsCommaDelimited
एक सहसंबद्ध उपश्रेणी के साथ बनाया गया है।
SQL सर्वर में for xml path
किसी क्वेरी परिणाम का XML प्रतिनिधित्व बनाने के लिए उपयोग किया जाता है। कॉलम एलियासेस और path
. के पैरामीटर का उपयोग करके XML कैसे बनाया जाता है, इस पर आपका अच्छा नियंत्रण है और root
.
संयोजित मान ', '+T.Name
सहसंबंधित सबक्वेरी में एक कॉलम नाम और खाली पैरामीटर नहीं होगा for xml path('')
बिना किसी टैग के एक्सएमएल बनाता है। केवल एक टेक्स्ट मान लौटाया जाएगा।
जब आप type
जोड़ते हैं
एक for xml
क्वेरी डेटा प्रकार होगा XML
.
किसी XML से मान प्राप्त करने के लिए आपको value()
तरीका। आप एक स्ट्रिंग पर कास्ट कर सकते हैं लेकिन अगर आपने ऐसा किया तो आपको उदाहरण के लिए &
. मिलेगा स्ट्रिंग में जहाँ भी आपने &
का उपयोग किया है ।
value()
. में पहला पैरामीटर फ़ंक्शन xQuery अभिव्यक्ति है जिसका उपयोग आपके इच्छित मान को प्राप्त करने के लिए किया जाता है। text()
का प्रयोग करें यह निर्दिष्ट करने के लिए कि आप केवल वर्तमान तत्व के लिए मान चाहते हैं। [1]
SQL सर्वर को बता रहा है कि आप चाहते हैं कि पहला टेक्स्ट नोड मिले (आपके पास यहां केवल एक है) लेकिन यह अभी भी आवश्यक है।
for xml
. द्वारा बनाई गई स्ट्रिंग क्वेरी में एक अतिरिक्त अल्पविराम और स्ट्रिंग की शुरुआत में एक स्थान होता है और इसे निकालने की आवश्यकता होती है। यहां मैं XQuery फ़ंक्शन का उपयोग करता हूं substring
सब कुछ पाने के लिए लेकिन पहले दो अक्षर।
दूसरा पैरामीटर value()
डेटाटाइप निर्दिष्ट करता है जिसे वापस किया जाना चाहिए।