首页 > 解决方案 > 使用 SQL 更新具有 XML 的表中的特定列

问题描述

我正在尝试更新其中包含多个命名空间的表中的特定列。我的表结构是:

+------+---------+-----------------------------------------------------------------------+
| cid  | cidtype |                               xml_data                                |
+------+---------+-----------------------------------------------------------------------+
| 1001 | N       | <Main  xmlns:json=""http://www.samplenamespace.com/json"" >           |
|      |         | <ID json:ValueType=""Number"">1001</ID>                               |
|      |         | <details>                                                             |
|      |         | <name xmlns:json=""http://www.samplenamespace.com/json"">John</name>  |
|      |         | <age  xmlns:json=""http://www.samplenamespace.com/json"">12</age>     |
|      |         | </details>                                                            |
|      |         | </Main>                                                               |
| 1003 | N       | <Main  xmlns:json=""http://www.samplenamespace.com/json"" >           |
|      |         | <ID json:ValueType=""Number"">1003</ID>                               |
|      |         | <details>                                                             |
|      |         | <name xmlns:json=""http://www.samplenamespace.com/json"">Diane</name> |
|      |         | <age  xmlns:json=""http://www.samplenamespace.com/json"">25</age>     |
|      |         | </details>                                                            |
|      |         | </Main>                                                               |
| 1004 | N       | <Main  xmlns:json=""http://www.samplenamespace.com/json"" >           |
|      |         | <ID json:ValueType=""Number"">1004</ID>                               |
|      |         | <details>                                                             |
|      |         | <name xmlns:json=""http://www.samplenamespace.com/json"">Kippy</name> |
|      |         | <age  xmlns:json=""http://www.samplenamespace.com/json"">26</age>     |
|      |         | </details>                                                            |
|      |         | </Main>                                                               |
+------+---------+-----------------------------------------------------------------------+

在此表中,我想更改xml_data列以删除http://www.samplenamespace.com/json<Main>node 之外的所有子节点的命名空间。

我的查询:

update #final --#final is my table
set xml_data.modify(replace('xmlns:json="http://www.samplenamespace.com/json"',' ','') where.... ) -- I don't know to access the root node here

有什么帮助吗?

标签: sqlsql-serverxmlsql-update

解决方案


由于您有两个元素需要清理,您可以在 xml_data 列上使用 sql replace 从 name 元素中删除命名空间,然后是 age 元素。这将使主要元素与所需的命名空间保持原样。

如何替换 SQL Server 表列中的字符串

create   TABLE [dbo].[foo]
(
cid int not null,
cidtype varchar(1) null,
xml_data varchar(max) null
)
go

insert into foo (cid,cidtype,xml_data) values
(1001,'N','<Main  xmlns:json=""http://www.samplenamespace.com/json"" >           
 <ID json:ValueType=""Number"">1001</ID>                               
 <details>                                                             
 <name xmlns:json=""http://www.samplenamespace.com/json"">John</name>  
 <age  xmlns:json=""http://www.samplenamespace.com/json"">12</age>     
 </details>                                                            
 </Main>')


 insert into foo (cid,cidtype,xml_data) values (1003, 'N',
 '<Main  xmlns:json=""http://www.samplenamespace.com/json"" >            
  <ID json:ValueType=""Number"">1003</ID>                                
  <details>                                                              
  <name xmlns:json=""http://www.samplenamespace.com/json"">Diane</name>  
  <age  xmlns:json=""http://www.samplenamespace.com/json"">25</age>      
  </details>                                                             
  </Main>')
  insert into foo (cid,cidtype,xml_data) values (1004,'N',
  '<Main  xmlns:json=""http://www.samplenamespace.com/json"" >            
 <ID json:ValueType=""Number"">1004</ID>                                
 <details>                                                              
 <name xmlns:json=""http://www.samplenamespace.com/json"">Kippy</name>  
 <age  xmlns:json=""http://www.samplenamespace.com/json"">26</age>      
 </details>                                                             
 </Main>')
 go
 select * from foo

 update foo
set xml_data = replace(xml_data, 'name xmlns:json=""http://www.samplenamespace.com/json""', 'name ')
go
update foo
set xml_data = replace(xml_data, 'age  xmlns:json=""http://www.samplenamespace.com/json""', 'age ')
go
select * from foo

推荐阅读