Add a column with NULL as value to generate a separate item node for each column.
SELECT
t.col1 as 'item'
,NULL
,t.col2 as 'item'
,NULL
,t.col3 as 'item'
FROM dbo.tbl as t
FOR XML PATH('parent'), TYPE;
Result:
<parent>
<item>1</item>
<item>2</item>
<item>3</item>
</parent>
SQL Fiddle
Why does this work?
Columns without a name are inserted as text nodes. In this case the NULL value is inserted as a text node between the item
nodes.
If you add actual values instead of NULL you will see what is happening.
SELECT
t.col1 as 'item'
,'1'
,t.col2 as 'item'
,'2'
,t.col3 as 'item'
FROM dbo.tbl as t
FOR XML PATH('parent'), TYPE;
Result:
<parent>
<item>1</item>1<item>2</item>2<item>3</item></parent>
Another way to specify a column without a name is to use the wildcard character *
as a column alias.
Columns with a Name Specified as a Wildcard Character
It is not necessary to use the wildcard in this case because the columns with NULL values don't have a column name but it is useful when you want values from actual columns but you don't want the column name to be a node name.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…