如何为表的每一行创建 xml 字符串?

Him*_*man 3 sql-server

我有下面的sql表。我需要xmls在表中添加一列,使表如下所示。

CREATE TABLE employees(
      id          integer,
      name        VARCHAR(MAX),
      designation VARCHAR(MAX),
      manager     integer,
      hired_on    date,
      salary      integer,
      commission  float,
      dept        integer);
INSERT INTO employees VALUES (1,'JOHNSON','ADMIN',6,'12-17-1990',18000,NULL,4);
INSERT INTO employees VALUES (2,'HARDING','MANAGER',9,'02-02-1998',52000,300,3);
INSERT INTO employees VALUES (3,'TAFT','SALES I',2,'01-02-1996',25000,500,3);
INSERT INTO employees VALUES (4,'HOOVER','SALES I',2,'04-02-1990',27000,NULL,3);
SELECT * FROM employees WHERE id < 10;
Run Code Online (Sandbox Code Playgroud)

新的列 xml 应该如下所示(下面最后一列),我知道我可以在字符串实用程序的帮助下完成它,但无法找出简单但有效且最佳的解决方案。

在此输入图像描述

这是我尝试过的,但这并没有给我结束标签summary

SELECT (
SELECT id AS '@id',
designation AS '@type',
salary AS '@salary'
FROM employees b 
WHERE b.id = a.id
FOR XML PATH('summary'))
FROM employees a
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Cha*_*ace 10

严格来说,自闭合标签<summary />和完整标签<summary></summary>在 XML 中具有相同的含义,因此对于您或任何适当的 XML 解析器来说,它们应该没有什么区别。

但是,如果您想强制它生成完整标签而不是自关闭标签,您可以添加一个空text()列:

SELECT (
    SELECT
      e.id AS [@id],
      e.designation AS [@type],
      e.salary AS [@salary],
      '' AS [text()]
    FOR XML PATH('summary')
  )
FROM employees e;
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴

子查询中不需要自连接,可以直接引用外层列。另请注意,您应该[]在必要时使用引用列,而不是''.


旁注:您不需要存储此 XML,您可以创建一个视图,在查询时将其显示出来。