SQL Server FOR XML PATH嵌套问题

时间:2010-10-18 19:58:43

标签: sql sql-server xml

我正在尝试将查询转换为以正确格式返回xml

查询只是SELECT * FROM [TABLENAME],是的,它必须是*,因为它用于需要在任何表上工作的动态实用程序。

无论如何,我希望结果记录能够嵌套两个级别,如此

<Root>
   <RecordParent>
      <Record>
          <!--Fields selected with * end up here-->
      </Record>
   </RecordParent>
   <RecordParent>
      <Record>
          <!--Fields selected with * end up here-->
      </Record>
   </RecordParent>
   <RecordParent>
      <Record>
          <!--Fields selected with * end up here-->
      </Record>
   </RecordParent>
</Root>

但是我似乎无法获得这个xml,我所做的最好的是

SELECT ( 
    SELECT * FROM tableName FOR XML PATH('Record'), TYPE
) FOR XML PATH('RecordParent'), ROOT('Root')

最终会像

一样
<Root>
   <RecordParent>
      <Record>
          <!--Fields selected with * end up here-->
      </Record>
      <Record>
          <!--Fields selected with * end up here-->
      </Record>
      <Record>
          <!--Fields selected with * end up here-->
      </Record>
   </RecordParent>
</Root>

我是如何通过FOR XML获得正确结果的?

修改

我可以用几行来完成

DECLARE @xml xml
SET @xml = (SELECT TOP 10 * FROM tableName FOR XML PATH('Record'), ROOT('Records'))
SELECT  r.query('.')FROM @xml.nodes('//Record') R(r) FOR XML PATH('RecordParent'), ROOT('Root'), TYPE

4 个答案:

答案 0 :(得分:1)

我可以用几行来完成

DECLARE @xml xml
SET @xml = (SELECT TOP 10 * FROM tableName FOR XML PATH('Record'), ROOT('Records'))
SELECT  r.query('.')FROM @xml.nodes('//Record') R(r) FOR XML PATH('RecordParent'), ROOT('Root'), TYPE

答案 1 :(得分:0)

你当然可以使用FOR XML EXPLICIT获得结果,但这是一个PITA。由于FOR PATH不允许在路径中使用分隔符,我猜你运气不好,但也许你可以在XML上应用XQuery。

http://msdn.microsoft.com/en-us/library/ms189068.aspx

答案 2 :(得分:0)

这是一个黑客:

declare @table table (Id int identity(1,1), Name varchar(50))


insert into @table values ('asdf')
insert into @table values ('fdsa')
insert into @table values ('fhgdf')
insert into @table values ('qewry')
insert into @table values ('sdtkjfhj')



select
(
select *
from @table
for XML PATH('Record'), ROOT('RecordParent'), type
) for xml path('root')

答案 3 :(得分:0)

您可以定义它使用/用于层次结构

从客户端FOR XML ROOT('Root')中选择Top(10)id作为“Record Parent / Record / ClientID”