使用SQL更新具有XML的表中的特定列

时间:2018-07-02 16:26:48

标签: sql sql-server xml sql-update

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

SELECT client_channel_nameid
     , SUM(CASE
               WHEN EXTRACT(day FROM order_date) = 21 THEN selling_price
               ELSE 0
             END) AS "21"
     , SUM(CASE
               WHEN EXTRACT(day FROM order_date) = 20 THEN selling_price
               ELSE 0
             END) AS "20"
FROM   sale_order so
JOIN   sale_order_item soi
  ON soi.sale_orderid = so.sale_orderid
GROUP  BY so.client_channel_nameid 

在此表中,我想更改+------+---------+-----------------------------------------------------------------------+ | 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>

有帮助吗?

1 个答案:

答案 0 :(得分:1)

由于必须清理两个元素,因此可以在xml_data列上使用sql replace从name元素和age元素中删除名称空间。 这样会将主要元素保留在所需的名称空间中。

How to replace a string in a SQL Server Table Column

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