यह समझाने का सबसे आसान तरीका यह है कि FOR XML PATH
वास्तविक XML के लिए कैसे काम करता है।एक साधारण तालिका Employee
कल्पना कीजिए:
EmployeeID Name
1 John Smith
2 Jane Doe
आप इस्तेमाल कर सकते हैं के रूप में PATH
से 'कर्मचारी' निकाला जा रहा है
<Employee>
<EmployeeID>1</EmployeeID>
<Name>John Smith</Name>
</Employee>
<Employee>
<EmployeeID>2</EmployeeID>
<Name>Jane Doe</Name>
</Employee>
इस प्रकार
SELECT EmployeeID, Name
FROM emp.Employee
FOR XML PATH ('Employee')
यह XML बन जाएगा यह तो बाहरी एक्सएमएल टैग को हटा क्वेरी:
SELECT Name
FROM Employee
FOR XML PATH ('')
<Name>John Smith</Name>
<Name>Jane Doe</Name>
क्या आप तो कर रहे हैं आदर्श नहीं है बनाने चाहेंगे, स्तंभ नाम 'डेटा()' एक एसक्यूएल त्रुटि है क्योंकि यह एक xml टैग जो एक कानूनी टैग नहीं है बनाने के लिए कोशिश कर रहा है मजबूर करता है, तो निम्न त्रुटि उत्पन्न होती है:
कॉलम नाम 'डेटा()' में XML के लिए आवश्यक एक अवैध XML पहचानकर्ता शामिल है; '(' (0x0028) की गलती पहले वर्ण है
सहसंबद्ध सबक्वेरी इस त्रुटि को छुपाता है और सिर्फ कोई टैग के साथ एक्सएमएल उत्पन्न करता है:।
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;
** कृपया ध्यान दें, जो आपके कोड की तरह पाठ वाले पात्रों के लिए विफल होगा><& ** आप '' <, जैसे चरित्र विस्तार मिल जाएगा '>' '' & इस संयोजन करने के लिए एक बेहतर तरीका है, देखें: http://stackoverflow.com/a/5031297/65223 –