创建具有相同的标签名称
问题描述:
表名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输出?
答
它是硬编码的,但应该工作:
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
相同的输出。
答
您可以使用这样的查询:
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')
为什么具有值2的节点ID进入内部?它等于1记录? –
@KannanKandasamy我需要这种格式。每行都进入标签全部进来xml。如果我有4行4即将结束。标签在每行的值开始 –
Sathish