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 节点 的相关文章

随机推荐

  • 如何从 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