I have this xml :
DECLARE @x XML
SET @x =
'<data>
<add>a</add>
<add>b</add>
<add>c</add>
</data>';
Task :
I want to list the a,b,c.
approach 1 :
SELECT s.value('.', 'VARCHAR(8000)') AS [ADD]
FROM @x.nodes('/data/add') AS t(s)
approach 2:
DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @x
SELECT *
FROM OPENXML(@idoc, '/data/add', 2)
WITH ([add] NVARCHAR(MAX) '.')
both of them give me :

question :
which is the preferred way ?
Is there any advantages of the latter vs former ( or vice verse) ?
A simple test shows that your approach 1 takes less time than approach 2. I would not draw any conclusions about it always being the case. It can depend on how your XML is structured and how you need to query the XML.
Stored procedures to test on:
Test:
Result approach 1:
Result approach 2:
(Tested on SQL Server 2005.)