how to add attribute for all subnodes of the xml in sql(如何在sql中为xml的所有子节点添加属性)
问题描述
我在变量@xml中有一个像下面这样的xml
I have a xml like below in a variable @xml
<ContentTemplate>
<Tab Title="TGVzc29u">
<Section Title="TGVzc29uIE9wZW5pbmc=" />
<Section Title="TGVzc29uL0FjdGl2aXR5" />
</Tab>
<Tab Title="V3JhcCBVcCBhbmQgQXNzZXNzbWVudA==">
<Section Title="TGVzc29uIENsb3Npbmc=" />
<Section Title="VHJhY2tpbmcgUHJvZ3Jlc3MvRGFpbHkgQXNzZXNzbWVudA==" />
</Tab>
<Tab Title="RGlmZmVyZW50aWF0ZWQgSW5zdHJ1Y3Rpb24=">
<Section Title="U3RyYXRlZ2llcyAtIEtleXdvcmQ=" />
<Section Title="U3RyYXRlZ2llcyDigJMgVGV4dA==" />
<Section Title="UmVzb3VyY2Vz" />
<Section Title="QWNjZWxlcmF0aW9uL0VucmljaG1lbnQ=" />
</Tab>
<Tab Title="RGlzdHJpY3QgUmVzb3VyY2Vz">
<Section Title="UmVsYXRlZCBDb250ZW50IEl0ZW1z" />
<Section Title="T3RoZXI=" />
</Tab>
</ContentTemplate>
我想为上述 xml 中的所有选项卡节点插入一个属性..输出应如下所示:
I want to insert an attribute for all tab nodes in the above xml.. the output should be like below:
<ContentTemplate>
<Tab Title="TGVzc29u" PortletName="CommunitiesViewer">
<Section Title="TGVzc29uIE9wZW5pbmc=" />
<Section Title="TGVzc29uL0FjdGl2aXR5" />
</Tab>
<Tab Title="V3JhcCBVcCBhbmQgQXNzZXNzbWVudA==" PortletName="CommunitiesViewer">
<Section Title="TGVzc29uIENsb3Npbmc=" />
<Section Title="VHJhY2tpbmcgUHJvZ3Jlc3MvRGFpbHkgQXNzZXNzbWVudA==" />
</Tab>
<Tab Title="RGlmZmVyZW50aWF0ZWQgSW5zdHJ1Y3Rpb24=" PortletName="CommunitiesViewer">
<Section Title="U3RyYXRlZ2llcyAtIEtleXdvcmQ=" />
<Section Title="U3RyYXRlZ2llcyDigJMgVGV4dA==" />
<Section Title="UmVzb3VyY2Vz" />
<Section Title="QWNjZWxlcmF0aW9uL0VucmljaG1lbnQ=" />
</Tab>
<Tab Title="RGlzdHJpY3QgUmVzb3VyY2Vz" PortletName="CommunitiesViewer">
<Section Title="UmVsYXRlZCBDb250ZW50IEl0ZW1z" />
<Section Title="T3RoZXI=" />
</Tab>
</ContentTemplate>
我尝试了下面的代码来得到上面的xml
i tried the following code to get the above xml
set @xml.modify( 'insert attribute PortletName {sql:variable("@PortletName")} into (ContentTemplate/Tab)[1]')
它只是更新第一个子节点.
its just update the first sub node.
如何更新xml的所有子节点..
how to update all the sub nodes of the xml..
提前致谢
推荐答案
变量中的 XML
DECLARE @xml XML=
N'<ContentTemplate>
<Tab Title="TGVzc29u">
<Section Title="TGVzc29uIE9wZW5pbmc=" />
<Section Title="TGVzc29uL0FjdGl2aXR5" />
</Tab>
<Tab Title="V3JhcCBVcCBhbmQgQXNzZXNzbWVudA==">
<Section Title="TGVzc29uIENsb3Npbmc=" />
<Section Title="VHJhY2tpbmcgUHJvZ3Jlc3MvRGFpbHkgQXNzZXNzbWVudA==" />
</Tab>
<Tab Title="RGlmZmVyZW50aWF0ZWQgSW5zdHJ1Y3Rpb24=">
<Section Title="U3RyYXRlZ2llcyAtIEtleXdvcmQ=" />
<Section Title="U3RyYXRlZ2llcyDigJMgVGV4dA==" />
<Section Title="UmVzb3VyY2Vz" />
<Section Title="QWNjZWxlcmF0aW9uL0VucmljaG1lbnQ=" />
</Tab>
<Tab Title="RGlzdHJpY3QgUmVzb3VyY2Vz">
<Section Title="UmVsYXRlZCBDb250ZW50IEl0ZW1z" />
<Section Title="T3RoZXI=" />
</Tab>
</ContentTemplate>';
1) FLWOR
.modify()
语句允许您更改 XML 中的一个合适的点,但是您需要多次调用才能更改许多位置.FLWOR 允许您重新构建 XML:
1) FLWOR
The .modify()
-statement allows you to change one decent point in your XML, but you'd need many calls to change many places. FLWOR allows you to re-build the XML out of itself:
SET @xml=@xml.query(
'<ContentTemplate>
{
for $t in /ContentTemplate/Tab
return
<Tab Title="eyR0L0BUaXRsZX0=" PortletName="CommunitiesViewer">
{$t/*}
</Tab>
}
</ContentTemplate>');
SELECT @xml
2) 使用 SELECT ... FOR XML PATH()
重建你会用这种方法达到同样的效果:再次重建 XML,但这次它被切碎并用作新的 SELECT ... FOR XML PATH
SELECT tb.value('@Title','nvarchar(max)') AS [@Title]
,'CommunitiesViewer' AS [@PortletName]
,tb.query('*')
FROM @xml.nodes('/ContentTemplate/Tab') AS A(tb)
FOR XML PATH('Tab'),ROOT('ContentTemplate')
这篇关于如何在sql中为xml的所有子节点添加属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在sql中为xml的所有子节点添加属性


- 如何使用 pip 安装 Python MySQLdb 模块? 2021-01-01
- 在SQL中,如何为每个组选择前2行 2021-01-01
- 导入具有可变标题的 Excel 文件 2021-01-01
- 更改自动增量起始编号? 2021-01-01
- 远程 mySQL 连接抛出“无法使用旧的不安全身份验证连接到 MySQL 4.1+"来自 XAMPP 的错误 2022-01-01
- 如何将 Byte[] 插入 SQL Server VARBINARY 列 2021-01-01
- SQL 临时表问题 2022-01-01
- 如何将 SonarQube 6.7 从 MySQL 迁移到 postgresql 2022-01-01
- 使用 Oracle PL/SQL developer 生成测试数据 2021-01-01
- 以一个值为轴心,但将一行上的数据按另一行分组? 2022-01-01