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

अल्पविराम सीमांकित सूची SQL सर्वर बनाने के लिए यह क्वेरी क्या करती है?

इसे समझाने का सबसे आसान तरीका यह देखना है कि 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; 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पूर्वाभ्यास:SQL सर्वर उच्च उपलब्धता की स्थापना

  2. DATEDIFF के लिए एक समाधान () SQL सर्वर में SET DATEFIRST को अनदेखा करना (T-SQL उदाहरण)

  3. SQL सर्वर 2016:sys.dm_exec_function_stats

  4. ओवरलैपिंग दिनांक अंतराल मर्ज करें

  5. SQL सर्वर डेटाबेस में अद्वितीय बाधा स्क्रिप्ट कैसे उत्पन्न करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 99