खोज…


टिप्पणियों

FOR XML मोड के FOR XML कई अन्य भी हैं:

  • FOR XML RAW - प्रति पंक्ति एक <row> तत्व बनाता है।
  • FOR XML AUTO - एक पदानुक्रम को स्वतः प्राप्त करने का प्रयास।
  • FOR XML EXPLICIT - FOR XML EXPLICIT के आकार पर अधिक नियंत्रण प्रदान करता है, लेकिन FOR XML PATH तुलना में अधिक बोझिल है।

हैलो वर्ल्ड एक्सएमएल

SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>

नाम स्थान निर्दिष्ट करना

SQL सर्वर 2008
WITH XMLNAMESPACES (
    DEFAULT 'http://www.w3.org/2000/svg',
    'http://www.w3.org/1999/xlink' AS xlink
)
SELECT 
    'example.jpg' AS 'image/@xlink:href',
    '50px' AS 'image/@width',
    '50px' AS 'image/@height'
FOR XML PATH('svg')
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
    <image xlink:href="firefox.jpg" width="50px" height="50px"/>
</svg>

XPath अभिव्यक्तियों का उपयोग करके संरचना को निर्दिष्ट करना

SELECT
    'XPath example' AS 'head/title',
    'This example demonstrates ' AS 'body/p',
    'https://www.w3.org/TR/xpath/' AS 'body/p/a/@href',
    'XPath expressions' AS 'body/p/a'
FOR XML PATH('html')
<html>
    <head>
        <title>XPath example</title>
    </head>
    <body>
        <p>This example demonstrates <a href="https://www.w3.org/TR/xpath/">XPath expressions</a></p>
    </body>
</html>

FOR XML PATH , बिना नाम के कॉलम टेक्स्ट नोड बन जाते हैं। NULL या '' इसलिए खाली टेक्स्ट नोड बन जाते हैं। नोट: आप एक नामांकित कॉलम को AS *

DECLARE @tempTable TABLE (Ref INT, Des NVARCHAR(100), Qty INT)
INSERT INTO @tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)

SELECT ROW_NUMBER() OVER (ORDER BY Ref) AS '@NUM',
     'REF' AS 'FLD/@NAME', REF AS 'FLD', '',
     'DES' AS 'FLD/@NAME', DES AS 'FLD', '',
     'QTY' AS 'FLD/@NAME', QTY AS 'FLD'
FROM @tempTable 
FOR XML PATH('LIN'), ROOT('row')
<row>
  <LIN NUM="1">
    <FLD NAME="REF">100001</FLD>
    <FLD NAME="DES">Normal</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="2">
    <FLD NAME="REF">100002</FLD>
    <FLD NAME="DES">Foobar</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="3">
    <FLD NAME="REF">100003</FLD>
    <FLD NAME="DES">Hello World</FLD>
    <FLD NAME="QTY">2</FLD>
  </LIN>
</row>

पाठ नोड्स का उपयोग (खाली) अगले आउटपुट को अगले एक से अलग करने में मदद करता है, ताकि SQL सर्वर अगले कॉलम के लिए एक नया तत्व शुरू करना जानता हो। अन्यथा, यह भ्रमित हो जाता है जब विशेषता पहले से ही मौजूद है जो यह सोचता है कि "वर्तमान" तत्व है।

उदाहरण के लिए, SELECT स्टेटमेंट में तत्व और विशेषता के बीच खाली स्ट्रिंग्स के बिना, SQL सर्वर एक त्रुटि देता है:

एट्रिब्यूट-सेंट्रिक कॉलम 'FLD / @ NAME' XML गैर-विशेषता के लिए XML पदानुक्रम में XML पदानुक्रम के बाद नहीं आना चाहिए।

यह भी ध्यान रखें कि इस उदाहरण भी एक मूल तत्व नामित में XML लिपटे row , द्वारा निर्दिष्ट ROOT('row')

मूल्यों को संक्षिप्त करने के लिए XML पथ का उपयोग करना

FOR XML PATH का उपयोग स्ट्रिंग में मानों को बदलने के लिए किया जा सकता है। नीचे दिए गए उदाहरण CSV स्ट्रिंग में मानों को बदलते हैं:

DECLARE @DataSource TABLE
(
    [rowID] TINYINT
   ,[FirstName] NVARCHAR(32)
);

INSERT INTO @DataSource ([rowID], [FirstName])
VALUES (1, 'Alex')
      ,(2, 'Peter')
      ,(3, 'Alexsandyr')
      ,(4, 'George');

SELECT STUFF
(
    (
        SELECT ',' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
);

कुछ महत्वपूर्ण नोट:

  • ORDER BY क्लॉज का उपयोग मूल्यों को पसंदीदा तरीके से ऑर्डर करने के लिए किया जा सकता है
  • यदि एक लंबे मूल्य का उपयोग संघनित्र विभाजक के रूप में किया जाता है, तो STUFF फ़ंक्शन पैरामीटर को भी बदलना होगा;
SELECT STUFF
(
    (
        SELECT '---' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,3 -- the "3" could also be represented as: LEN('---') for clarity
    ,''
);
  • TYPE विकल्प और .value फ़ंक्शन का उपयोग किया जाता है, NVARCHAR(MAX) स्ट्रिंग के साथ काम करता है


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow