SQL Server 更新值 XML 节点

2024-01-04

我在 SQL Server 中有 2 个表

Table1

   ID   - Name  - Phone
   1      HK      999    
   2      RK      888
   3      SK      777
   4      PK      666

Table2

   ID   - XMLCol
   1      XMLVal1

XMLVal1

   <Root>
    <Data1>
     <ID>1</ID>
     <Name>HK</Name> 
     </Data1>
    <Data1>
     <ID>2</ID>
     <Name>RK</Name>
     </Data1>
    </Root>

现在我将 GUID 列插入到Table1

Table1

   ID   - Name  - Phone  - GUID
   1      HK      999      HJHHKHJHJHKJH8788 
   2      RK      888      OONMNy7878HJHJHSD
   3      SK      777      POMSDHBSNB775SD87
   4      PK      666      HRBMASJMN76448NDN

In Table2XML 列,我想更新ID节点具有新的 GUID 值而不更改元素名称。

所以现在 XML 是

   <Root>
    <Data1>
     <ID>HJHHKHJHJHKJH8788</ID>
     <Name>HK</Name> 
     </Data1>
    <Data1>
     <ID>OONMNy7878HJHJHSD</ID>
     <Name>RK</Name>
     </Data1>
    </Root>

这将发生在所有行中Table2.

请帮我解决这个问题。


一次不可能在多个位置更新 XML,因此您必须在某种循环中执行此操作。我能想到的最好办法是从 XML 中提取 IDTable2并加入反对Table1.ID生成一个临时表来保存Table2.ID的顺序位置Data1XML 中的节点 (OrdPos)和新的GUID value.

然后,您可以循环遍历 XML 列中存在的最大节点数并进行更新。

-- Variable used to loop over nodes
declare @I int 

-- Temp table to hold the work that needs to be done.
create table #T
(
  ID int, -- ID from table2
  OrdPos int, -- Ordinal position of node Data1 in root
  GUID uniqueidentifier, -- New ID
  primary key (OrdPos, ID)
)

-- Shred the XML in Table2, join to Table1 to get GUID
insert into #T(ID, OrdPos, GUID)
select T2.ID,
       row_number() over(partition by T2.ID order by D.N) as OrdPos,
       T1.GUID
from Table2 as T2
  cross apply T2.XMLCol.nodes('Root[1]/Data1') as D(N)
  inner join Table1 as T1
    on T1.ID = D.N.value('(ID/text())[1]', 'int')

-- Get the max number of nodes in one row that needs to be updated
set @I = 
  (
    select top(1) count(*)
    from #T
    group by ID
    order by 1 desc
  )

-- Do the updates in a loop, one level at a time
while @I > 0
begin
  update T2
  set XMLCol.modify('replace value of (/Root[1]/Data1[sql:variable("@I")]/ID/text())[1] 
                     with sql:column("T.GUID")')
  from Table2 as T2
    inner join #T as T
      on T2.ID = T.ID
  where T.OrdPos = @I

  set @I = @I - 1
end

drop table #T

SQL小提琴 http://sqlfiddle.com/#!3/987e0/2

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

SQL Server 更新值 XML 节点 的相关文章

  • 在 PL/SQL 中将绑定变量与动态 SELECT INTO 子句结合使用

    我有一个关于 PL SQL 中的动态 SQL 语句中可以使用绑定变量的问题 例如 我知道这是有效的 CREATE OR REPLACE FUNCTION get num of employees p loc VARCHAR2 p job V
  • 同时使用 GUID 和自动递增整数

    我一直在研究使用 GUID 作为数据库中的主键 到目前为止 利似乎大于弊 然而 我发现 GUID 可能不是我想要的 在我的应用程序中 用户应该能够根据用户友好的 ID 来识别对象 因此 例如 如果他们想要获取特定产品而不输入全名 则可以使用
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • “作为自身执行”与跨数据库视图

    SQL Server 2016 数据库中有一个视图A从另一个数据库中的表中进行选择 B use A go create view TheView as select from B dbo SomeTable 我有 dbo 访问权限B数据库
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 无法删除 Access 中 SQL 表上的注册表

    我有一个在 Access 应用程序中链接的 SQL Server 表 如果我尝试使用删除查询删除记录 则没有问题 但是 如果我尝试直接在表中删除记录或在数据表模式下使用选择查询 Access 不允许我删除记录并引发以下警告 Microsof
  • SQL 中基于下一条记录和上一条记录的复杂排序

    这是一个后续问题根据 SQL 中的下一条记录和上一条记录进行排序 https stackoverflow com questions 30477803 sorting based on next and previous records i
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • 可以使用表通配符创建 sql 查询吗?

    这可能是一个简单的问题 但我无法在网上找到解决方案 任何帮助将不胜感激 我正在尝试在 PHP 中创建一个 SQL 查询 并希望以某种方式将通配符应用于 TABLE 过滤器 可能是这样的 select from table 但是 到目前为止我
  • Solr 索引在分隔符上分割字段

    我正在尝试使用一些数据设置 Solr 索引 但是我想将我的字段之一作为管道分隔发送并在 Solr 端拆分 例如
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • C#:DataSet.readXML( "filepath" ) 如何处理包含对象内对象内对象的 XML 文件?

    我有一个 xml 文件 格式如下
  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • sql查询获取从一月到当月的所有数据,即使没有记录

    我不擅长 sql 所以任何帮助世界都很棒 我有一个 SQL 查询 可以获取从一月到当月注册的记录 我的代码示例 SELECT DatePart YEAR p createStamp as TheYear DatePart MONTH p c
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i

随机推荐

  • 如何从 std::string 获取可写的 C 缓冲区?

    我正在尝试使用 MFC 移植我的代码CString to std string适用于微软Windows平台 我对某件事很好奇 在下面的例子中说 CString MakeLowerString LPCTSTR pStr CString str
  • 无法将下一个js部署到azure

    我正在尝试将我的 NEXTJS 应用程序部署到 azure 我使用安装了 Node 的 Linux 操作系统创建了一个 Web 应用程序 我的package json看起来像这样 name frontend version 1 0 0 de
  • 使用同一个ajax调用打开多个动态链接

    我正在显示多个使用相同的动态链接 ajax加载第一个链接上的内容很好 但不适用于其余链接 如何让它加载同一div中其他链接的内容 Html string a href link name name a div div Jquery href
  • 使用 GoogleMap 或 MapBox Direction API 在我的应用程序中实现我自己的导航

    我想在我的 Android 应用程序中为驾驶员实现导航地图 我不想使用 URL 方案打开 google 地图应用程序来导航 我更喜欢在我的应用程序中实现此导航功能 就像 Google 地图一样 我的要求很简单 将用户从一个地方导航到另一个地
  • shouldComponentUpdate 并非从未被调用

    请看一下我的代码 我尝试限制给定无状态组件的重新渲染 但这样做发现 shouldComponentUpdate 永远不会被调用 我已经从 styledComponents 中删除了包装器 之前有人报道过这种情况 但仍然绝对没有被调用 除此之
  • 在 JavaScript 中迭代带有“洞”的数组

    我有一个数组 其中一些项目将被删除 但有些循环仍在运行 所以我想简单地跳过删除对象的地方 我知道 for i in array 的语法应该执行此操作 因为它会迭代索引 但是我应该如何删除我的项目呢 因为当我执行 array 4 null 时
  • 查看pdf时隐藏或修改Webview2的工具栏

    我正在使用新的 Webview2 控件在 WPF 应用程序中呈现 Pdf 文件 这运行良好 但我想自定义工具栏以隐藏例如某些条件的保存按钮 我没有找到直接从 Webview2 CoreWebView2 对象执行此操作的方法或属性 但是 如果
  • 尝试调用自定义过滤器会导致“错误 TS2349:无法调用类型缺少调用签名的表达式”

    我试图从 Angular 控制器调用自定义过滤器 但收到错误 无法调用类型缺少调用签名的表达式 我在我从事的上一个项目中是这样实现的 所以我不知道哪里出了问题 此时过滤器不包含任何逻辑 因为我需要先编译它 这是过滤器
  • 用带孔的多边形制作 sf 对象并设置 crs

    With contourLines 我已经提取了数据的 95 轮廓 我想用正确的 crs 制作一个 sf 对象 虽然我无法分享我的实际数据集 但我改编了一个示例SO post https stackoverflow com question
  • Codeigniter ajax使用ajax代码将数据发送到控制器

  • 如何在 WinRT 8.1 上 P/调用 kernel32.dll

    我正在尝试使用本机 API 方法 GetNativeSystemInfo 在 Windows 8 1 上标记为支持手机和桌面应用商店应用程序 在文档中 它被列为存在于 kernel32 dll 中 伟大的 所以我对 P Invoke 的第一
  • Android:如何使用 AlarmManager

    我需要在 20 分钟后触发一段代码AlarmManager正在设置 有人可以向我展示有关如何使用的示例代码吗AlarmManager在 Android 中 我已经研究了一些代码几天了 但它不起作用 一些示例代码 并不是那么容易AlarmMa
  • 停止运行 PHP 服务器,命令行

    所以我已经做到了php S localhost 8000 但我不再需要它了 我需要找回我的 8000 localhost 如何停止php服务器 killall 9 php 我就是这么做的
  • Coq 无法在 Z 上计算有根据的函数,但它可以在 nat 上运行

    我正在 为我自己 写一篇关于如何在 Coq 中进行有根据的递归的解释 参见 Coq Art 书 第 15 2 章 首先我做了一个基于的示例函数nat效果很好 但后来我又做了一次Z 当我使用Compute来评估它 它并没有一直降低到Z价值 为
  • 为什么 Android Studio 告诉我使用 getSupportActionBar() 而不是 getActionBar()?

    只需在这个新奇的 Android Studio 0 8 6 beta 中将一个非常简单的帮助活动 仅显示资源文件中的 HTML 文本块 添加到一个非常简单的测试应用程序中 我就会收到以下警告 但没有提供的理由 理由 有谁知道为什么 还有是否
  • 如何将 url 中的变量传递给 Django 列表视图

    我有一个 Django 通用列表视图 我想根据输入 URL 的值进行过滤 例如 当有人输入 mysite com defaults 41 时 我希望视图过滤所有与 41 匹配的值 我遇到过一些使用基于函数的视图来执行此操作的方法 但没有使用
  • HTML5显示上传的图像直到下一张上传?

    我不确定是否应该为此使用 HTML5 存储 我的问题是如何实现以下目标 想象一下博物馆里有一面空框架的墙 我希望用户从他或她的计算机上传图像 该图像将显示在墙上的框架中 div 如果用户想要检查另一个图像 可以 删除 前一个图像 然后应该显
  • 正则表达式排除某些标签

    只是需要快速帮助来解决这个问题 我想从字符串中删除除白名单 变量 中的标签之外的所有 html 标签 到目前为止我的代码 whitelist p br ul li strike em strong a reqExp new RegExp l
  • 当 UIButton 获得焦点时,Siri Remote 的菜单按钮不会退出应用程序

    我凌驾于一切之上pressesBegan接收选择按下 当焦点位于某个对象上时 Siri 远程菜单按钮不会退出我的应用程序UIButton 如果没有 UI 元素获得焦点 菜单按钮将按预期工作 当焦点位于某个位置时 如何接收菜单按钮按下的消息U
  • SQL Server 更新值 XML 节点

    我在 SQL Server 中有 2 个表 Table1 ID Name Phone 1 HK 999 2 RK 888 3 SK 777 4 PK 666 Table2 ID XMLCol 1 XMLVal1 XMLVal1