SQL Server - 仅使用 .modify() 合并两个 XML

2024-02-29

假设我们有:

CREATE TABLE #Users(id INT PRIMARY KEY, name VARCHAR(100), suggestions XML);

INSERT INTO #Users(id, name, suggestions)
SELECT 1, 'Bob', N'<Products>
                     <Product id="1" score="1"/>
                     <Product id="2" score="5"/>
                     <Product id="3" score="4"/>
                   </Products>'
UNION ALL
SELECT 2, 'Jimmy', N'<Products>
                       <Product id="6" score="3"/>
                     </Products>';

DECLARE @userId INT = 1,
        @suggestions XML = N'<Products>
                              <Product id="2" score="5"/>
                              <Product id="3" score="2"/>
                              <Product id="7" score="1" />
                             </Products>';

Playground https://data.stackexchange.com/stackoverflow/query/429347

现在我想合并 2 个 XMLid属性:

id = 1 用户的最终结果:

<Products>
  <Product id="1" score="1"/> -- nothing changed (but not exists in @suggestions)
  <Product id="2" score="5"/> -- nothing changed (but exists in @suggestions)
  <Product id="3" score="2"/> -- update score to 2
  <Product id="7" score="1"/> -- insert new element
</Products>

请注意,它不是组合 2 个 XML,而是“更新插入”操作。

Remarks:

  • 我知道这种模式违反了数据库规范化,规范化它是正确的方法(但不是在这种情况下)
  • 我知道利用派生表的解决方案,.nodes() and .value()函数首先解析两个 XML,然后合并并写回

我正在寻找的是XPath/XQuery将其合并到一个语句中的表达式(无派生表/dynamic-sql*):

* If absolutely needed, Dynamic SQL could be used, but I want to avoid it.

UPDATE #Users
SET suggestions.modify(... sql:variable("@suggestions") ...); --changes only here
WHERE id = @userId;


/* replace ... for ... where ... with sql:variable */

经过一段时间的尝试,我认为这是不可能的......

这里有类似的问题:XQuery 在单个 SQL 更新命令中添加或替换属性 https://stackoverflow.com/q/3854308/5089204

The .modify(insert Expression1 ... )不允许获取数据within通过传入的 XML@sql:variable() or sql:column()

阅读此处:https://msdn.microsoft.com/en-us/library/ms175466.aspx https://msdn.microsoft.com/en-us/library/ms175466.aspx在 Expression1 -> “常量 XML 或独立 sql:column / sql:variable 或 XQuery(到同一实例)

DECLARE @xml1 XML= --the existing XML
'<Products>
  <Product id="1" score="1" />
  <Product id="2" score="5" />
  <Product id="3" score="4" />
</Products>';

DECLARE @xml2 XML= --the XML with new or changed data
'<Products>
  <Product id="2" score="5" />
  <Product id="3" score="2" />
  <Product id="7" score="1" />
</Products>';

SET @xml1.modify('insert sql:variable("@xml2") as first into /Products[1]');

SELECT @xml1;

/* The full node is inserted!
Without any kind of preparation there is NO CHANCE to get the inner nodes only

<Products>
  <Products>
    <Product id="2" score="5" />
    <Product id="3" score="2" />
    <Product id="7" score="1" />
  </Products>
  <Product id="1" score="1" />
  <Product id="2" score="5" />
  <Product id="3" score="4" />
</Products>
*/

您可以这样声明第二个 XML:

DECLARE @xml2 XML= --the XML with new or changed data
'<Product id="2" score="5" />
 <Product id="3" score="2" />
 <Product id="7" score="1" />';

但是您将没有机会使用 id 的值作为 XQuery 过滤器

SET @xml1.modify('insert sql:variable("@xml2") as first into /Products[**How should one filter here?**]');

最后但并非最不重要的一点是,我认为没有机会在一次调用中组合两个不同的 XML_DML 语句.modify().

我唯一的想法就是这个,但行不通。好像只能用IFwithin一个表达式,但不是两个区分两个执行路径

SET @xml1.modify('if (1=1) then
                     insert sql:variable("@xml2") as first into /Products[1]
                  else
                     replace value of /Products[1]/Product[@id=1][1]/@score with 100');

所以我的结论是:不,这是不可能的......

我在这里提供的解决方案https://stackoverflow.com/a/35060150/5089204 https://stackoverflow.com/a/35060150/5089204在第二部分(“如果你想‘合并’两本书结构”)将是我解决这个问题的方法。

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

SQL Server - 仅使用 .modify() 合并两个 XML 的相关文章

  • 从 Axios 响应中解析 XML,推送到 Vue 数据数组

    在我的 Vue 应用程序中 我使用 Axios 获取 XML 文件并使用parseString将 XML 解析为 JSON 然后我需要通过result到 Vue 数据 this events My console log将解析后的 XML
  • 有向图 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
  • PDO 和 Microsoft SQL:必须声明表变量“@P1”

    我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目 我正在使用的代码看起来与我在文档中找到的代码类似 但是 当我运行它时 我收到以下警告 警告 PDOStatement execute pdostateme
  • 如何使用 xpath 提取
    标记之间的文本

    以下是我的应用程序中按钮的代码 span class ms cui ctl largelabel New br Map span 我想单击该按钮并使用 Selenium Webdriver 我尝试了多种组合 但它对我不起作用 以下是我尝试过
  • 将表与同一个表的前一条记录连接起来

    我有一个包含历史记录的表 由主表中的多个触发器发布到那里 我想在历史表上创建一个 select 语句 其中每个记录都由其先前的记录 由相同的 LineID 和最高的 ActionDate 标识 连接 这样我就可以提取这两者之间的差异 我尝试
  • 在 JSP 中迭代列表对象

    我正在做一个项目来尝试自学 spring 和 struts 我目前卡在 JSP 页面上 我有一个 pojo 类 其中包含带有 getter setter 的变量 eid 和 ename 我还有一个 sql 中的表 其具有相同的值和六个填充行
  • 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 似乎正在舍入一些DateTime当我将它们保存到时 值不合适datetime列 我怀疑我错过了一些东西 但我找不到它 我正在使用 NET 4 0 针对 SQL Server 2008 运
  • 如何在 SQL Server 会话中设置自动提交?

    如何在 SQL Server 会话中设置自动提交 您可以通过将implicit transactions设置为OFF来打开自动提交 SET IMPLICIT TRANSACTIONS OFF 当设置为ON时 返回隐式事务模式 在隐式事务模式
  • 没有 DateAdd() 的 SSIS 表达式前一个日期

    目前正在开发一个包 它将表达式从先前的日期传递到文件名 我当前的代码如下作为字符串变量 DT WSTR 20 DATEPART YYYY Dateadd DD 1 dateadd MM datediff MM DT DATE 1900 01
  • T-SQL 中的不等式测试

    我刚刚在 WHERE 子句中遇到了这个 AND NOT t id id 这与以下内容相比如何 AND t id id Or with AND t id lt gt id 我总是自己写后者 但显然其他人有不同的想法 其中一个的表现会比另一个更
  • 删除 SQL Server 上的所有扩展属性

    如何以可编写脚本的方式删除 SQL Server 上的所有扩展属性 如果您想要一个能够一次性删除所有扩展属性的脚本 请使用 Jamie Thomson 创建的脚本 该脚本将为所有扩展属性生成删除 您可以从这里下载article http s
  • 对 SQL Server 2005 结果进行分页

    如何在 SQL Server 2005 中对结果进行分页 我在 SQL Server 2000 中尝试过 但没有可靠的方法来做到这一点 我现在想知道SQL Server 2005是否有任何内置方法 分页的意思是 例如 如果我按用户名列出用户
  • 为什么实体框架 6 在插入后不只选择scope_identity()?

    当您使用 EF 6 1 保存实体时 将生成并执行以下 SQL 代码 exec sp executesql N INSERT dbo Customers Name FirstName VALUES 0 1 SELECT CustomerId
  • 在本地托管 W3 XML 架构文件

    我在一家公司工作 我们有自己的 XML 语言 有自己的一组模式来验证W3 架构 https www w3 org 2009 01 xml xsd 出于业务原因 我需要在内部托管这些文件 而不是依赖于网络托管版本 我对 XML 模式缺乏经验
  • XPath 查找所有匹配项 C# XmlDocument

    我想弄清楚如何找到字符串中的所有匹配项XmlDocument XmlNodeList results document SelectNodes Products Product fn matches SearchWord 我试图比较inne
  • 无法在 SSIS 查找中选择 ODBC 源

    我正在创建一个用于更新 SQL Server 中的表的包 要更新的详细信息是从 MySQL 数据库获取的 为此 我使用 ODBC 连接管理器连接到 MySQL 但此 ODBC 连接管理器未在 OLE DB 连接管理器中列出 我可以在 Too
  • 在带有循环引用的表中插入 SQL

    我有 2 张桌子 Empleados numEmpl nombre apellido sexo telefono salario numDept Departamentos numDept nombreDept numDirect 在部门中
  • SQL Server XQuery 返回错误

    我正在 SQL Server 2012 中对 XML 数据类型列执行查询 数据示例如下

随机推荐

  • 使用 HTML5 文件 API 检查文件是否已更改

    好的 我有一个程序 它将一些特定数据输出到制表符分隔的变量文件中 我一直在使用 Excel 打开和查看文件内容 但是我发现 Excel 坚持锁定它打开的每个文件 这非常烦人 因为如果我在 Excel 中打开文件 我的程序就会崩溃 但我真的很
  • EL 2.1 和 2.2 之间的差异

    我正在寻找 EL 2 1 和 2 2 之间的差异列表 我知道 EL 2 1 和 2 2 之间的一个区别是 2 2 中传递方法参数的能力 还有其他区别吗 有没有可用的功能比较表来说明差异 我已经找了好几天了 到目前为止还没有找到它 谢谢 答案
  • 如何释放 C++ WinRT 值结构的内存

    我是否必须以及如何从已返回到托管 C 项目的 Windows 运行时组件中创建的值结构中释放内存 我声明了该结构 Custom struct public value struct PlayerData Platform String Na
  • 计算不同字段中具有匹配值的记录数

    我有一个这样的表 myTable id name orig id 01 Bill 02 Tom 01 03 Sam 01 04 Alex 02 05 Phil 06 Bob 01 我想要一个返回每条记录的查询 但添加了一个列 其中包含 or
  • Form.ShowDialog(IWin32Window) 应该与任何窗口句柄一起使用吗?

    使用时System Windows Forms ShowDialog IWin32Window 我应该能够传递一个IWin32Window代表任何窗口句柄并且它是否相对于该窗口是模态的 作为 Internet Explorer 7 扩展的一
  • 在 Heroku 上更新应用程序而不丢失图像链接

    我在 Heroku 上有一个应用程序 用户可以在其中添加图像 当我更新这个应用程序时git push heroku master 所有图像都消失了 只留下断开的链接 你知道如何避免吗 Heroku 对他们的文件系统有特殊的限制 因为它只读
  • 在rails中assert_select第一个和第二个html表格单元格内容

    我有以下 html 表 table class list user permission tr th Name th th Permission th tr tr td test user01 td td Reading permissio
  • 托管 Blazor WASM GetFromJsonAsync:JSON 值无法转换为 System.Collections.Generic.IEnumerable`

    我尝试过挖掘和调试 但似乎无法弄清楚为什么 Http Json GetFromJsonAsync 无法转换 我得到的错误如下 删节 blazor webassembly js 1 crit Microsoft AspNetCore Comp
  • Bing 地图 - 悬停时突出显示带有多边形的国家/地区

    我正在使用 silverlight Bing 地图控件 我想在用鼠标光标悬停它后突出显示国家 大陆 除了提供多边形坐标之外 还有更好的方法吗 如果我想强调世界上所有国家 那就太费功夫了 我认为应该有某种现成的解决方案 但我找不到 不 除了提
  • 在 Python 中使用自定义字体将 SVG 转换为 PNG

    我正在使用基于 Cairo RSVG 的解决方案将 SVG 光栅化为 PNG StackOverflow 上已经对它进行了描述在 Python 中将 SVG 转换为 PNG https stackoverflow com questions
  • 返回总和的 Lisp 函数

    我正在尝试编写一个奇怪的函数 所以请耐心等待 这个函数应该有一个列表L作为参数并有一个sum多变的 如果L不是列表 它应该返回nil 否则 它应该迭代列表的每个元素并执行以下操作 如果元素是数字且小于零 则应从总和中减去 1 如果元素是数字
  • 时间序列 - 相关性和滞后时间

    我正在研究一组输入变量和响应变量价格之间的相关性 这些都是按时间顺序排列的 1 我是否有必要平滑曲线其中输入变量是循环变量 自回归 如果是这样 怎么办 2 一旦建立相关性 我想准确量化输入变量如何影响响 应变量 例如 一旦 X 增加 gt
  • 缩放、旋转和裁剪图像

    我希望在 GUI 中能够永久缩放 旋转和裁剪图像 将更改保存到文件中 WPF本身就有能力吗 如果不是 是否有任何组件可以与 WPF 更好地集成 我还需要调整 JPEG 和 TIFF 格式的图像亮度和对比度 删除边框 Thisarticle
  • 为什么 Common Lisp 中冒号位于变量之前

    Common Lisp 中变量前面的冒号语法是什么意思 我见过这样的程序 我将在这里从大量函数中展示一些示例代码 defun expand successorf node mapcar lambda action state cost le
  • 重载类的流插入 (<<) 运算符

    它经常作为类的友元函数被重载 有什么方法可以将其重载为成员函数吗 有什么方法可以将其重载为成员函数吗 假设你有课Foo并且您想使用 Foo foo std cout lt lt foo 不 它不能 仅当第一个参数是类的对象时 成员函数重载才
  • 将 YouTube 嵌入代码精简为仅 URL

    请帮忙 我需要删除以下代码 以便它只使用 值 部分
  • 删除 ASP.net MVC 单页应用程序中的身份验证

    我正在尝试在 Visual Studio 2013 中使用 asp net MVC SPA 模板 我不需要任何身份验证位 我只需要直接加载到控制器页面之一 如何删除初始模板中的所有身份验证内容 去除 Authorize 注释来自HomeCo
  • 创建一个触发器,它将在另一个表更新时在表中插入记录

    假设我有表 T1 和 T2 Columns of T1 gt Value Columns of T2 gt OldValue NewValue 我需要的是一个触发器 它将在 T1 更新时在 T2 中插入一条记录 我还需要知道旧值和新值 我以
  • 如何在 R 中读取文本文件并创建数据框

    需要读取txt文件中https raw githubusercontent com fonnesbeck Bios6301 master datasets addr txt https raw githubusercontent com f
  • SQL Server - 仅使用 .modify() 合并两个 XML

    假设我们有 CREATE TABLE Users id INT PRIMARY KEY name VARCHAR 100 suggestions XML INSERT INTO Users id name suggestions SELEC