Microsoft SQL Server
XML पथ के लिए
खोज…
टिप्पणियों
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>
नाम स्थान निर्दिष्ट करना
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)
स्ट्रिंग के साथ काम करता है