Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 创建具有相同标记名的Xml_Sql Server_Xml_Sql Server 2014 - Fatal编程技术网

Sql server 创建具有相同标记名的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> 如

表名:样本

列名:id,名称

每行创建一个单独的标记,标记内有

如下所示显示Xml值

<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