इसे समझाने का सबसे आसान तरीका यह देखना है कि FOR XML PATH
. कैसे वास्तविक एक्सएमएल के लिए काम करता है। एक साधारण तालिका की कल्पना करें Employee
:
EmployeeID Name
1 John Smith
2 Jane Doe
आप उपयोग कर सकते हैं
SELECT EmployeeID, Name
FROM emp.Employee
FOR XML PATH ('Employee')
यह XML को इस प्रकार बनाएगा
<Employee>
<EmployeeID>1</EmployeeID>
<Name>John Smith</Name>
</Employee>
<Employee>
<EmployeeID>2</EmployeeID>
<Name>Jane Doe</Name>
</Employee>
PATH
. से 'कर्मचारी' को हटाना बाहरी xml टैग को हटा देता है इसलिए यह क्वेरी:
SELECT Name
FROM Employee
FOR XML PATH ('')
बनाएंगे
<Name>John Smith</Name>
<Name>Jane Doe</Name>
फिर आप जो कर रहे हैं वह आदर्श नहीं है, कॉलम नाम 'डेटा ()' एक एसक्यूएल त्रुटि को मजबूर करता है क्योंकि यह एक एक्सएमएल टैग बनाने की कोशिश कर रहा है जो कानूनी टैग नहीं है, इसलिए निम्न त्रुटि उत्पन्न होती है:
<ब्लॉककोट>कॉलम नाम 'डेटा ()' में एक अमान्य XML पहचानकर्ता है जैसा कि FOR XML द्वारा आवश्यक है; '('(0x0028) गलती का पहला अक्षर है।
सहसंबद्ध उपश्रेणी इस त्रुटि को छुपाती है और बिना किसी टैग के XML उत्पन्न करती है:
SELECT Name AS [Data()]
FROM Employee
FOR XML PATH ('')
बनाता है
John Smith Jane Doe
फिर आप रिक्त स्थान को अल्पविराम से बदल रहे हैं, काफी आत्म व्याख्यात्मक...
अगर मैं तुम होते तो मैं क्वेरी को थोड़ा सा अनुकूलित करता:
SELECT E1.deptno,
STUFF(( SELECT ', ' + E2.ename
FROM emp AS e2
WHERE e1.deptno = e2.DEPTNO
FOR XML PATH('')
), 1, 2, '')
FROM EMP AS e1
GROUP BY DEPTNO;
कोई कॉलम उपनाम नहीं होने का मतलब होगा कि कोई एक्सएमएल टैग नहीं बनाया गया है, और चयनित क्वेरी के भीतर अल्पविराम जोड़ने का मतलब है कि रिक्त स्थान वाले किसी भी नाम से त्रुटियां नहीं होंगी,STUFF
पहला अल्पविराम और स्थान हटा देगा।
अतिरिक्त
केएम ने एक टिप्पणी में क्या कहा है, इसके बारे में विस्तार से बताने के लिए, क्योंकि ऐसा लगता है कि इसे कुछ और विचार मिल रहे हैं, एक्सएमएल वर्णों से बचने का सही तरीका .value
का उपयोग करना होगा। इस प्रकार है:
SELECT E1.deptno,
STUFF(( SELECT ', ' + E2.ename
FROM emp AS e2
WHERE e1.deptno = e2.DEPTNO
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
FROM EMP AS e1
GROUP BY DEPTNO;