2016-09-23 52 views
1

表名XML:样品创建具有相同的标签名称

列名:ID,名称

每一行创建内部独立标签。

显示这样

<Details> 
    <id>1</id> 
    <name>na</name> 
    <Details> 
     <id>2</id> 
     <name>aa</name> 
    </Details> 
    </Details> 

XML值我试过这样,但它不工作

select 
    id  'Details\id' 
    ,name 'Details\name' 
from sample 

如何获取XML输出?

+0

为什么具有值2的节点ID进入内部?它等于1记录? –

+0

@KannanKandasamy我需要这种格式。每行都进入标签全部进来xml。如果我有4行4即将结束。

标签在每行的值开始 – Sathish

回答

2

它是硬编码的,但应该工作:

DECLARE @x xml 

SELECT @x = (
    SELECT x+'' 
    FROM (
     SELECT '%details?%id?'+CAST(id as nvarchar(max))+'%/id?%name?'+name+'%/name?' x 
     FROM [sample] s 
     UNION ALL 
     SELECT '%/details?' 
     FROM [sample] s 
     ) as t 
    FOR XML PATH('') 
) 
SELECT CAST(REPLACE(REPLACE((CAST(@x as nvarchar(max))),'%','<'),'?','>') as xml) 

In [sample]表我:

(1,'na'), 
(2,'aa'), 
(3,'sd') 

输出:

<details> 
    <id>1</id> 
    <name>na</name> 
    <details> 
    <id>2</id> 
    <name>aa</name> 
    <details> 
     <id>3</id> 
     <name>sd</name> 
    </details> 
    </details> 
</details> 

编辑

此外,它可以用递归CTE来完成:

DECLARE @x xml 

;WITH rec AS (
SELECT CAST((
      SELECT TOP 1 id, 
          [name] 
      FROM [sample] 
      ORDER BY id DESC 
      FOR XML PATH('details') 
     ) as xml) as d, 
     1 as [Level] 
UNION ALL 
SELECT CAST((
      SELECT id, 
        [name], 
        cast(r.d as xml) 
      FROM [sample] 
      WHERE s.id = id 
      FOR XML PATH('details') 
     ) as xml) as d, 
     r.[Level]+1 
FROM [sample] s 
INNER JOIN rec r 
    ON s.id = CAST(r.d.query('/details/id/text()') as nvarchar(max))-1 
) 

SELECT TOP 1 WITH TIES d 
FROM rec 
ORDER BY [Level] desc 

相同的输出。

+0

奇怪的格式,但这不是你的错...... greate解决方案! – Shnugo

+0

更好,不能upvote两次... – Shnugo

+0

谢谢@Shnugo!我认为第一个有点复杂,可以用递归CTE完成。是的!它可以 – gofr1

0

您可以使用这样的查询:

SELECT 
    *, 
    (SELECT 
     * 
    FROM #details 
    WHERE id = 2 
    FOR xml PATH ('Details'), TYPE) 
FROM #details 
WHERE id = 1 
FOR xml PATH ('Details') 

对于内环您可以使用CTE

表创建脚本:

CREATE TABLE #details (
    id int, 
    name varchar(10) 
) 

INSERT INTO #details (id, name) 
    VALUES (1, 'test'), (2, 'test2') 
+0

我只给出样本数据。我有超过2行 – Sathish

+0

正如我所说的递归循环,你需要使用基于你的逻辑的CTE。在这里,我只是硬编码如何做嵌套xml –

+0

如何在xml中使用CTE可以显示示例 – Sathish