【问题标题】:Create Xml with Same tag name创建具有相同标签名称的 Xml
【发布时间】:2016-09-23 13:01:58
【问题描述】:

表名称:示例

列名:id,name

每一行用里面创建单独的标签。

像这样显示 Xml 值

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

我试过这样但它不起作用

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

如何获得该 xml 输出?

【问题讨论】:

  • 为什么节点id值为2的进来?它与 1 相等吗?
  • @KannanKandasamy 我需要这种格式。每行都在标签内,所有 都在 end xml 中。如果我有 4 行 4 结束。
    标签开始于每一行的值

标签: sql-server xml sql-server-2014


【解决方案1】:

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

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)

[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

相同的输出。

【讨论】:

  • 奇怪的格式,但这不是你的错...很好的解决方案!
  • 谢谢@Shnugo!我认为第一个有点复杂,可以使用递归 CTE 来完成。是的!它可以
【解决方案2】:

你可以像这样使用查询:

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 行
  • 正如我所说的递归循环,您需要根据您的逻辑使用 CTE。在这里,我只是硬编码了如何做嵌套 xml
  • 让我试着更好地理解你的循环,如果你有记录 1、2、3、4 那么你的输出必须是 1 内 1 我们需要有 2 和内 2 你需要有3 和里面 3 你需要有 4 对吗?
  • 您生成这样的 xml 是否有具体原因?使用 xml 时这将非常困难..
  • 我需要那种类型的xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2015-09-25
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多