Sql server 创建具有相同标记名的Xml
表名:样本 列名:id,名称 每行创建一个单独的标记,标记内有 如下所示显示Xml值Sql server 创建具有相同标记名的Xml,sql-server,xml,sql-server-2014,Sql Server,Xml,Sql Server 2014,表名:样本 列名:id,名称 每行创建一个单独的标记,标记内有 如下所示显示Xml值 <Details> <id>1</id> <name>na</name> <Details> <id>2</id> <name>aa</name> </Details> </Details> 如
<Details>
<id>1</id>
<name>na</name>
<Details>
<id>2</id>
<name>aa</name>
</Details>
</Details>
如何获得xml输出?您可以使用如下查询:
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')
它是硬编码的,但应能工作:
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)
输出:
<details>
<id>1</id>
<name>na</name>
<details>
<id>2</id>
<name>aa</name>
<details>
<id>3</id>
<name>sd</name>
</details>
</details>
</details>
相同的输出。为什么值为2的节点id出现在内部?它与1相同?KannanKandasamy我需要这种格式。每一行都包含在标记中,所有都包含在结束xml中。如果我有4行,4行结束。标记每行的起始值我只提供示例数据。我说过,对于递归循环,您需要根据您的逻辑使用CTE。在这里,我只是硬编码了如何进行嵌套xml让我试着更好地理解你的循环,如果你有记录1,2,3,4,那么你的输出必须是1中的1,我们需要有2,在2中你需要有3,在3中你需要有4,这是正确的吗?有没有具体的原因让你这样生成xml?这在使用xml时会非常困难。我需要那种类型的xml奇怪的格式,但这不是你的错。。。伟大的解决方案!谢谢@Shnugo!我认为第一个有点复杂,可以用递归CTE完成。是的!它可以
(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>
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