在不指定列名的情况下做到这一点有点棘手,但可行。
要使用此功能,您需要用您的表名替换@T
,并将表名称常量'StateProvince'
更改为您的表名称。
declare @T table
(
StateProvinceID int,
StateProvinceCode char(2),
CountryRegionCode char(2),
IsOnlyStateProvinceFlag int,
Name varchar(50),
TerritoryID int,
rowguid uniqueidentifier,
ModifiedDate datetime
)
insert into @T values
(1, 'AB', 'CA', 0, 'Alberta', 6, '298C2880-AB1C-4982-A5AD-A36EB4BA0D34', '2004-03-11T10:17:21.587'),
(2, 'AB', 'CA', 0, 'Alberta', 6, '298C2880-AB1C-4982-A5AD-A36EB4BA0D34', '2004-03-11T10:17:21.587')
select 'StateProvince' as [@name],
(
select
(
select T3.N.value('local-name(.)', 'sysname') as [@name],
T3.N.value('.', 'nvarchar(max)') as [@value]
from (
select T1.*
for xml path(''), type
) T2(N)
cross apply T2.N.nodes('*') as T3(N)
for xml path('COL'), root('ROW'), type
)
from @T as T1
for xml path(''), type
)
for xml path('TABLE')
结果:
<TABLE name="StateProvince">
<ROW>
<COL name="StateProvinceID" value="1" />
<COL name="StateProvinceCode" value="AB" />
<COL name="CountryRegionCode" value="CA" />
<COL name="IsOnlyStateProvinceFlag" value="0" />
<COL name="Name" value="Alberta" />
<COL name="TerritoryID" value="6" />
<COL name="rowguid" value="298C2880-AB1C-4982-A5AD-A36EB4BA0D34" />
<COL name="ModifiedDate" value="2004-03-11T10:17:21.587" />
</ROW>
<ROW>
<COL name="StateProvinceID" value="2" />
<COL name="StateProvinceCode" value="AB" />
<COL name="CountryRegionCode" value="CA" />
<COL name="IsOnlyStateProvinceFlag" value="0" />
<COL name="Name" value="Alberta" />
<COL name="TerritoryID" value="6" />
<COL name="rowguid" value="298C2880-AB1C-4982-A5AD-A36EB4BA0D34" />
<COL name="ModifiedDate" value="2004-03-11T10:17:21.587" />
</ROW>
</TABLE>
注:表格中的列名必须是一个有效的XML元素名称。例如,您可以在列名中没有任何空格。
感谢Mikael,之前我曾见过类似的东西,并希望我失去了一些更容易。 :-) – SumOfDavid 2012-03-03 22:28:14