SQL Server FOR XML Path创建重复节点

2024-03-23

我想使用 SQL Server 2012 生成以下输出:

<parent>
  <item>1</item>
  <item>2</item>
  <item>3</item>
</parent>

来自同一个表中的三个不同列(我们将它们称为 col1、col2 和 col3)。

我正在尝试使用这个查询:

SELECT 
  t.col1 as 'item'
 ,t.col2 as 'item'
 ,t.col3 as 'item' 
FROM tbl t 
FOR XML PATH('parent'), TYPE

但我得到的是这样的:

<parent>
  <item>123</item>
</parent>

我在这里做错了什么?


添加一个以 NULL 作为值的列,为每列生成一个单独的项目节点。

SELECT 
  t.col1 as 'item'
 ,NULL
 ,t.col2 as 'item'
 ,NULL
 ,t.col3 as 'item' 
FROM dbo.tbl as t 
FOR XML PATH('parent'), TYPE;

Result:

<parent>
  <item>1</item>
  <item>2</item>
  <item>3</item>
</parent>

SQL小提琴 http://sqlfiddle.com/#!6/2e29f/1

为什么这有效?

没有名称的列将作为文本节点插入。在这种情况下,NULL 值作为文本节点插入到item nodes.

如果您添加实际值而不是 NULL,您将看到发生了什么。

SELECT 
  t.col1 as 'item'
 ,'1'
 ,t.col2 as 'item'
 ,'2'
 ,t.col3 as 'item' 
FROM dbo.tbl as t 
FOR XML PATH('parent'), TYPE;

Result:

<parent>
  <item>1</item>1<item>2</item>2<item>3</item></parent>

指定没有名称的列的另一种方法是使用通配符*作为列别名。

名称指定为通配符的列 https://msdn.microsoft.com/en-us/library/bb500154.aspx

在这种情况下,没有必要使用通配符,因为具有 NULL 值的列没有列名,但当您需要实际列中的值但不希望列名是节点名时,它很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server FOR XML Path创建重复节点 的相关文章

  • Oracle 函数编译成功,但在执行 PLS-00221 时抛出错误:不是过程或未定义

    我有简单的oracle功能 create or replace function abs test func test in in number return number is test out number BEGIN test out
  • 尝试打开 Android XML 视图时 Eclipse 中抛出 NullPointerException?

    这是例外情况 java lang NullPointerException at android widget TextView setTextColor TextView java 1787 at android widget TabHo
  • 有向图 SQL

    我有以下数据集 它表示有向图中的节点 CREATE TABLE nodes NODE FROM VARCHAR2 10 NODE TO VARCHAR2 10 INSERT INTO nodes VALUES GT TG INSERT IN
  • 如何使用存储过程 SQL SERVER 2008 R2(mssql) 插入 PHP 数组值

    我有这个数组 REV Array 0 gt 240 1 gt 241 2 gt 242 3 gt 243 4 gt 249 我现在使用下面的代码进行插入 将每个数组的元素存储在带有 id userID Type 和 Date 的行中 if
  • SQL Server 数据归档解决方案

    我正在寻找一种解决方案来存档数据库中存在的数据 我的数据库是 SQL Server 2008 大约有 250 个表 我搜索网络并找到以下链接 http www dbazine com sql sql articles charran13 h
  • 在 JSP 中迭代列表对象

    我正在做一个项目来尝试自学 spring 和 struts 我目前卡在 JSP 页面上 我有一个 pojo 类 其中包含带有 getter setter 的变量 eid 和 ename 我还有一个 sql 中的表 其具有相同的值和六个填充行
  • 如何使用注释从类的属性值派生 xml 元素名称?

    我有 具有 id 值和名称的属性 我可以使用 XmlElement XmlArray C 注释用一个类来表示所有这些吗 我想从类属性派生 xml 元素名称name 我的课程看起来像 public class Property public
  • LINQ-to-SQL 是否支持组合查询?

    作为一名不懂 C 的程序员 我对 LINQ 查询的求值语义很好奇 如下所示 var people from p in Person where p age lt 18 select p var otherPeople from p in p
  • 如何在 SQL Server 会话中设置自动提交?

    如何在 SQL Server 会话中设置自动提交 您可以通过将implicit transactions设置为OFF来打开自动提交 SET IMPLICIT TRANSACTIONS OFF 当设置为ON时 返回隐式事务模式 在隐式事务模式
  • 在 XSLT 函数中处理空序列

    我有一个 XSLT 函数 它检查发送的参数是否采用 YYYYMMDD 格式 在某些情况下 我没有获得该函数的任何值 在这些情况下 SAXON 会抛出以下错误 不允许空序列作为 cda isValidDate 的第一个参数 有什么建议如何处理
  • 如何编辑表以启用级联删除?

    我有一个代表用户的表 当用户被删除时我得到 DELETE 语句与 REFERENCE 约束冲突 显然 CASCADE DELETE在SQL Server中并不像我想象的那么容易 需要将选项添加到表中 问题是 我不知道如何添加CASCADE
  • 使用聚合函数时减少 Athena 扫描的数据量

    以下查询扫描 100 MB 的数据 select from table where column1 val and partition id 20190309 然而 下面的查询扫描了 15 GB 的数据 有超过 90 个分区 select
  • 使用 sql 查询选择最近 30 天

    我正在查找过去 30 天内周一 周二 周三 周四 周五 周六 周日的数量 我可以在没有实际数据库表的情况下选择最近 30 天的日期和星期几吗 就像是 SELECT everything between convert date GETDAT
  • WHERE 子句或 ON 子句中的 INNER JOIN 条件?

    我今天输错了一个查询 但它仍然有效并给出了预期的结果 我的意思是运行这个查询 SELECT e id FROM employees e JOIN users u ON u email e email WHERE u id 139840 但我
  • 在本地托管 W3 XML 架构文件

    我在一家公司工作 我们有自己的 XML 语言 有自己的一组模式来验证W3 架构 https www w3 org 2009 01 xml xsd 出于业务原因 我需要在内部托管这些文件 而不是依赖于网络托管版本 我对 XML 模式缺乏经验
  • 如何在 SQL 中编写 where 子句来按一天中的时间过滤 DATETIME 列?

    我有带有 DATETIME 列时间戳的数据 我想将其过滤到 DATETIME 介于上午 9 30 到下午 5 30 之间的任意一天的记录集 最好的方法是什么 更新 更改是因为我需要精确到分钟 而不仅仅是小时 对于那个很抱歉 您始终可以将其编
  • SQL Server:比较两个表中的列

    我最近完成了从某些应用程序的旧版本到当前版本的迁移 在迁移数据库时遇到了一些问题 我需要一个可以帮助我比较两个表中的列的查询 我的意思不是行中的数据 我需要比较列本身来弄清楚我错过了表结构的哪些变化 看一下红门 SQL 比较 http ww
  • 在带有循环引用的表中插入 SQL

    我有 2 张桌子 Empleados numEmpl nombre apellido sexo telefono salario numDept Departamentos numDept nombreDept numDirect 在部门中
  • 对时间序列数据重新采样

    我有一个以毫秒为单位的时间序列列表 我想对时间序列进行重新采样并对组应用平均值 我如何在 Postgres 中实现它 重新采样 是指聚合一秒或一分钟内的所有时间戳 一秒或一分钟内的所有行形成一组 表结构 date x y z Use dat
  • 简单的t-sql而不是触发器

    任何人都可以帮助解决简单的 t sql 脚本与板载触发器的问题吗 我使用非常简单的触发器将数据从一个表复制到另一个表 这些表之间没有关系 当我尝试在触发器创建后 从同一脚本 直接第一次插入数据时 我得到了所需的结果 但所有接下来的尝试都会失

随机推荐