tsql:将列转换为xml列,每行一个xml

Sof*_*ion 4 xml t-sql sql-server

我的例子:

table:(col1 int, col2 int)
示例数据(在运行时将不知道真实数据):

1,1
2,2
3,3
4,4
Run Code Online (Sandbox Code Playgroud)

预期结果:仅一列(xml)
和4行

row1: <cols><col1>1</col1><col2>1</col2></cols>
row2: <cols><col1>2</col1><col2>2</col2></cols>
row3: <cols><col1>3</col1><col2>3</col2></cols>
row4: <cols><col1>4</col1><col2>4</col2></cols>
Run Code Online (Sandbox Code Playgroud)

对不起,主持人不希望删除"噪音回答".我希望他能理解我正在帮助这些可怜的家伙,所以没有人能看出他们完全错过了这一点.我在保护他们的声誉......

这是实现我想要的方式.但这不是一个好方法,因为xml是手工构建的,没有正确编码.

declare @colsList nvarchar(max)
set @colsList = ''
select @colsList = @colsList + '+ ''<' + COLUMN_NAME + '>'' + Isnull(cast( [' + COLUMN_NAME + '] as nvarchar(max)),'''') + ''</' + COLUMN_NAME + '>'' ' 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = 'SampleTable';

select @colsList = stuff(@colsList,1,1,'');
exec('select colsValues=cast(' + @colsList + ' as xml) from SampleTable');
Run Code Online (Sandbox Code Playgroud)

Sof*_*ion 18

嗯越简单越快越好.

select d=(select a.* for xml path('r'),type,elements absent)
from MyTable a
Run Code Online (Sandbox Code Playgroud)


小智 9

最简单的方法是使用它:

SELECT (SELECT T.* FOR XML RAW)
FROM MyTable T
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要更多地控制XML结构,您应该使用:

SELECT (SELECT T.* FROM (SELECT T.*) T FOR XML AUTO)
FROM MyTable T
Run Code Online (Sandbox Code Playgroud)