Sql server 选择查询中的通用XML
有没有一种方法可以从“从任意表中选择*”查询中获取此XMLSql server 选择查询中的通用XML,sql-server,tsql,Sql Server,Tsql,有没有一种方法可以从“从任意表中选择*”查询中获取此XML 如果您需要将XML转换为XML,可以考虑使用XSLT。 < P>如果您需要将XML转换为XML,可以考虑使用XSLT。 尝试: Declare @Temp Table(Id Int, Name VarChar(20)) Insert Into @Temp Values(321, 'Book') Insert Into @Temp Values(654, 'Pen') Select ( Select 'id
如果您需要将XML转换为XML,可以考虑使用XSLT。
< P>如果您需要将XML转换为XML,可以考虑使用XSLT。 尝试:
Declare @Temp Table(Id Int, Name VarChar(20))
Insert Into @Temp Values(321, 'Book')
Insert Into @Temp Values(654, 'Pen')
Select (
Select 'id' as '@name',
id as '@value'
From @Temp As B
Where A.Id = B.Id
FOR XML Path('column'), Type
),
(
Select 'name' as '@name',
Name as '@value'
From @Temp As B
Where A.Id = B.Id
FOR XML Path('column'), Type
)
From @Temp As A
FOR XML path('row'), Root('root')
请注意,这段代码使用了一个临时表变量,这样我就可以生成一些数据。修改此项以使用实际表格应该相对容易。尝试以下操作:
Declare @Temp Table(Id Int, Name VarChar(20))
Insert Into @Temp Values(321, 'Book')
Insert Into @Temp Values(654, 'Pen')
Select (
Select 'id' as '@name',
id as '@value'
From @Temp As B
Where A.Id = B.Id
FOR XML Path('column'), Type
),
(
Select 'name' as '@name',
Name as '@value'
From @Temp As B
Where A.Id = B.Id
FOR XML Path('column'), Type
)
From @Temp As A
FOR XML path('row'), Root('root')
请注意,这段代码使用了一个临时表变量,这样我就可以生成一些数据。修改它以使用实际的表应该相对容易。以下是一种获得所需结果的方法
declare @T table(id int, name varchar(20))
insert into @T values(321, 'Book')
insert into @T values(654, 'Pen')
select (
select 'id' as '@name',
T.id as '@value'
for xml path('column'), type
),
(
select 'name' as '@name',
T.name as '@value'
for xml path('column'), type
)
from @T as T
for xml path('row'), root('root')
如果您想使用选择*
对任何表使用此选项,您可以使用此选项。
只要用表名替换@T
。注意:只有列名是有效的XML元素名时,这才有效
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('column'), root('row'), type
)
from @T as T1
for xml path(''), root('root')
这里有一个方法可以得到你想要的结果
declare @T table(id int, name varchar(20))
insert into @T values(321, 'Book')
insert into @T values(654, 'Pen')
select (
select 'id' as '@name',
T.id as '@value'
for xml path('column'), type
),
(
select 'name' as '@name',
T.name as '@value'
for xml path('column'), type
)
from @T as T
for xml path('row'), root('root')
如果您想使用选择*
对任何表使用此选项,您可以使用此选项。
只要用表名替换@T
。注意:只有列名是有效的XML元素名时,这才有效
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('column'), root('row'), type
)
from @T as T1
for xml path(''), root('root')
这是一个相当大的话题!您可以从sql server没有XmlTransform函数开始,我不能在这里使用CLR。不能使用CLR吗?客户端转换?这是一个相当大的话题!您可以从sql server没有XmlTransform函数开始,我不能在这里使用CLR。不能使用CLR吗?客户端转换?谢谢,它对我的情况有效,但不适用。唯一的问题是它知道“Id”和“Name”列。我想找到一种方法,如何将select*从任何表转换为该格式。在子查询中不需要使用@Temp的from
。您可以使用别名A
直接查询字段。您将避免两次表格扫描。谢谢,它对我的情况有效,但不适用。唯一的问题是它知道“Id”和“Name”列。我想找到一种方法,如何将select*从任何表转换为该格式。在子查询中不需要使用@Temp的from
。您可以使用别名A
直接查询字段。您将避免两次表扫描。