आप इसे XQuery और एक पुनरावर्ती CTE (कोई OPENXML
. के साथ साफ-साफ कर सकते हैं) ):
DECLARE @xml xml
SET @xml = '<a><b /><c><d /><d /><d /></c></a>';
WITH Xml_CTE AS
(
SELECT
CAST('/' + node.value('fn:local-name(.)',
'varchar(100)') AS varchar(100)) AS name,
node.query('*') AS children
FROM @xml.nodes('/*') AS roots(node)
UNION ALL
SELECT
CAST(x.name + '/' +
node.value('fn:local-name(.)', 'varchar(100)') AS varchar(100)),
node.query('*') AS children
FROM Xml_CTE x
CROSS APPLY x.children.nodes('*') AS child(node)
)
SELECT DISTINCT name
FROM Xml_CTE
OPTION (MAXRECURSION 1000)
यह वास्तव में बहुत अधिक XQuery जादू नहीं कर रहा है, लेकिन कम से कम यह सब इनलाइन है, इसके लिए किसी संग्रहीत कार्यविधियों, विशेष अनुमतियों आदि की आवश्यकता नहीं है।