【问题标题】:Updating specific column in a table that has XML using SQL使用 SQL 更新具有 XML 的表中的特定列
【发布时间】:2018-07-02 16:26:47
【问题描述】:

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

+------+---------+-----------------------------------------------------------------------+
| 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 命名空间删除到除&lt;Main&gt; 节点之外的所有子节点。

我的查询:

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

有什么帮助吗?

【问题讨论】:

    标签: sql sql-server xml sql-update


    【解决方案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
    

    【讨论】:

    • 这个想法行之有效。但是,在我的存储过程中,我有大约 50 个元素需要更新。因此,在 51 个元素中,我只希望 1 个元素拥有命名空间,而更新 50 个元素非常繁琐。所以我试图为此添加一个“Where”条件。这可能吗?
    • 您可以将所有命名空间替换为空白,然后将命名空间添加回
    • 是的,我将所有字段的命名空间都设置为空白,然后单独添加到主节点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多