SQL Server FOR XML - 基本查询

2024-02-26

我已经获得了一个 XML 文档,我想通过 SQL 脚本生成该文档,但我没有做过类似的事情,也无法找到任何可以引导我生成所需的最终 XML 的示例(我不确定哪种可能的方法更适合我的需要 - EXPLICIT 或 PATH 或者甚至可能)。 我希望在从 SQL 生成 XML 方面有一定经验的人能够为我指明正确的方向(或者告诉我我想要做的事情是不可能的,我需要使用子查询来完成)。

场景是我从单个表返回产品详细信息(我希望不必对我需要的每个值进行子查询)。

我希望能够生成的 xml 看起来像这样(我无法控制这种格式):

<records>
    <record>
        <fields>
            <field name="id">
                <values>
                    <value>666111</value>
                </values>
            </field>
            <field name="name">
                <values>
                    <value>
                        <![CDATA[My Product Title]]>
                    </value>
                </values>
            </field>
        </fields>
    </record>
    <record>
        ...
    </record>
</records>

我研究的第一个方法是使用 FOR XML PATH

SELECT TOP 2 
    'id' AS "@name",
    p.product_id as [value], 
    p.title
FROM products p 
ORDER BY p.product_id DESC
FOR XML PATH ('field'), ROOT ('fields'), ELEMENTS;

这给了我 XML:

<fields>
  <field name="id">
    <value>20624</value>
    <title>test154</title>
  </field>
  <field name="id">
    <value>20623</value>
    <title>test153</title>
  </field>
</fields>

这给了我我需要的“”,但我无法指定下一个元素所需的布局。

我还研究了 FOR XML EXPLICIT

SELECT TOP 2
    1 AS Tag, NULL AS Parent,
    p.product_id AS [record!1!product_id!ELEMENT],
    NULL AS [values!2!value!ELEMENT]
FROM products p 
UNION ALL
SELECT TOP 2 
    2, 1,
    p.product_id,
    p.title
FROM products p 
ORDER BY [record!1!product_id!ELEMENT] DESC
FOR XML EXPLICIT;

这给了我以下 XML:

<record>
  <product_id>20624</product_id>
  <values>
    <value>test154</value>
  </values>
</record>
<record>
  <product_id>20623</product_id>
  <values>
    <value>test153</value>
  </values>
</record>

我有点迷失于能够建立请求或获得符合正确路线的东西(我认为我试图在一次查找中做太多事情,这就是我的问题的原因)。任何帮助都是值得赞赏的 - 即使它为我指出了一个好的指南(我发现的唯一的指南在示例方面非常糟糕 - 它们没有显示如何构建/更改它们的微妙之处)


这是您可能正在寻找的查询

The ,''中间是一个技巧,它允许您创建多个具有相同名称的元素,一个在另一个下面......

DECLARE @tbl TABLE(id INT,name VARCHAR(100));
INSERT INTO @tbl VALUES
 (666111,'My Product Title 111')
,(666222,'My Product Title 222');

SELECT 
(
    SELECT  'id' AS [field/@name]
           ,id AS [field/values/value]
           ,''
           ,'name' AS [field/@name]
           ,name AS [field/values/value]
    FOR XML PATH('fields'),TYPE
)
FROM @tbl AS tbl
FOR XML PATH('record'),ROOT('records')

结果

<records>
  <record>
    <fields>
      <field name="id">
        <values>
          <value>666111</value>
        </values>
      </field>
      <field name="name">
        <values>
          <value>My Product Title 111</value>
        </values>
      </field>
    </fields>
  </record>
  <record>
    <fields>
      <field name="id">
        <values>
          <value>666222</value>
        </values>
      </field>
      <field name="name">
        <values>
          <value>My Product Title 222</value>
        </values>
      </field>
    </fields>
  </record>
</records>

更新:据我所知,没有干净的方法来添加CDATA- 部分

由于某些原因,Microsoft 的人员认为 CDATA 部分是不必要的。好吧,他们不是,但有时仍然需要他们......

唯一的干净的方式 to add CDATA部分是要使用FOR XML EXPLICIT。其他解决方法就是放一些类似的东西'|' + name + '#'(使用实际数据中永远不会出现的两个字符。

然后你可以将结果投射到NVARCHAR(MAX),在字符串基础上替换这些字符。

这会将您的 XML 作为字符串返回

SELECT 
REPLACE(REPLACE(CAST(
(
SELECT 
(
    SELECT  'id' AS [field/@name]
           ,id AS [field/values/value]
           ,''
           ,'name' AS [field/@name]
           ,'|' + name + '#' AS [field/values/value]
    FOR XML PATH('fields'),TYPE
)
FROM @tbl AS tbl
FOR XML PATH('record'),ROOT('records')
) AS NVARCHAR(MAX)),'|','<![CDATA['),'#',']]>')

此刻你将其投射回XMLCDATA 消失了:-(

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

SQL Server FOR XML - 基本查询 的相关文章

随机推荐

  • 如何向 Qml 公开用于计算的 C++ 结构

    我有以下问题 我正在 C 中开发一个模型 在 Qml 中开发一个视图 通过控制器连接它们 在我的模型中 我执行了多项计算 我还为我的应用程序的用户提供了编写用 qml 编写的自定义事件处理程序的可能性 现在我遇到了一个问题 我决定使用定点表
  • 充当具有多个模型的树

    我有几个模型想要按层次结构关联在一起 为了简单起见 假设我有这三个 class Group lt ActiveRecord Base acts as tree has many users end class User lt ActiveR
  • T-SQL 美元符号表达式

    In 这个答案 https stackoverflow com a 7213596 3345644 有一个技巧可以使用ROW NUMBER 窗口函数中带有 常量 ORDER BY clause SELECT ROW NUMBER OVER
  • 为什么将数据导出到 .xlsx 比导出到 .xls 或 .csv 慢得多?

    我有一个要导出到 Excel 的数据框 人们希望它是 xlsx 格式 我用to excel 但是当我将扩展名从 xls 更改为 xlsx 时 导出步骤大约需要 9 秒 而不是 1 秒 导出到 csv 甚至更快 我相信这是因为它只是一个特殊格
  • 每次我在同一语料库上训练时,LDA 模型都会生成不同的主题

    我正在使用Pythongensim从包含 231 个句子的小语料库中训练潜在狄利克雷分配 LDA 模型 然而 每次我重复这个过程 它都会产生不同的主题 为什么相同的LDA参数和语料每次生成不同的主题 如何稳定话题生成 我正在使用这个语料库
  • ggplot2,更改标题大小

    我希望我的主标题和轴标题具有与图中注释文本相同的字体大小 我使用 theme get 并发现文本大小为 12 所以我在主题声明中这样做了 这不起作用 我也尝试将相对大小发送为1 但这不起作用 I was hoping someone cou
  • 更改maven Surefire-plugin的输出目录

    我正在尝试更改 Maven 项目中的surefire plugin 生成的XML 文件的输出文件夹 我在report plugin的配置括号内以及maven site plugin中声明了目标输出文件夹 在文档 https maven ap
  • 单击 iOS 证书续订时出错

    当我使用管理器并单击 续订 按钮时 出现以下错误 特别 此团队中没有带有 XP 的 iOS 证书 App Store 没有为参数 deviceids 提供值 我不确定为什么会收到这些错误 并且希望得到任何帮助 指导 我遇到了同样的问题 我什
  • java lambda 可以有超过 1 个参数吗?

    在 Java 中 是否可以让 lambda 接受多种不同类型 IE 单变量工作原理 Function
  • 来自 Facebook Messenger 机器人对话的 API 身份验证

    通过与 facebook Messenger 平台上的机器人对话来使用外部 API 进行身份验证的最佳方法是什么 举一个广泛的例子 我希望我的机器人的用户在外部网站的自己的个人资料上创建项目 有没有办法从用户那里获取登录信息 或者将我的机器
  • Python 警告 - 删除自定义警告消息末尾的原始警告输出的任何方法

    我正在尝试在 Python 脚本中创建自定义警告消息 allfiles glob glob folderpath xlsx if not allfiles warnings warn No xlsx data files are found
  • 当前与 delphi 2007 一起使用的正确 indy 和 openssl 版本是哪个

    我将 indy 组件与 D2007 一起使用 并尝试列出 imap 邮箱中的邮件主题 我下载并安装了当前的 indy 新版本 10 6 0 5039 安装 x100 软件包 并尝试使用各种 openssl dll 版本 xp 机器上的 32
  • 在iOS中,使用Swift,如何获取iPhone的启动时间?

    在核心运动中 数据在继承自的类中返回CMLogItem 其中有一个timestamp财产 这timestamp is a TimeInterval这是设备启动以来的时间 如何获取设备启动时间 从评论中我发现ProcessInfo proce
  • 与错误共享相关的性能计数器事件

    我正在查看 OpenMP 程序的性能 特别是缓存和内存性能 不久前我发现了如何使用 Vtune 分析性能的指南 其中提到了需要注意的计数器 不过现在好像找不到说明书了 如果您知道我有问题的手册或者您知道计数器 事件 请告诉我 另外 如果您有
  • Google Apps 脚本 - 使用 .replace 方法删除空格对我不起作用

    我正在使用 Google Apps 脚本来创建应用程序 当我尝试从电子表格值中删除空格时遇到问题 我也在 stackoverflow 和其他论坛上引用了很多帖子和评论 他们都在谈论使用 replace方法 然而 replace方法对我不起作
  • 动态加载资源文件

    我想动态加载资源文件 如果我静态地执行它 它显然效果很好 System Media SoundPlayer player new System Media SoundPlayer Properties Resources 88 player
  • 如何分离wpf文本框中的背景图像?

    我是 WPF 新手 在我的项目中 我尝试了带有用户图标的用户名文本框 我的 XAML 代码 gt
  • 用一个命令截断 MySQL 数据库中的所有表?

    是否有一个查询 命令 可以在一次操作中截断数据库中的所有表 我想知道是否可以通过一个查询来完成此操作 删除 即删除表 mysql Nse show tables DATABASE NAME while read table do mysql
  • 如何在Java中查找与通配符字符串匹配的文件?

    这应该很简单 如果我有一个像这样的字符串 Test sample txt 那么获取与此模式匹配的文件列表的普遍接受的方法是什么 例如 它应该匹配 Test1 sample22b txt and Test4 sample spiffy txt
  • SQL Server FOR XML - 基本查询

    我已经获得了一个 XML 文档 我想通过 SQL 脚本生成该文档 但我没有做过类似的事情 也无法找到任何可以引导我生成所需的最终 XML 的示例 我不确定哪种可能的方法更适合我的需要 EXPLICIT 或 PATH 或者甚至可能 我希望在从