【问题标题】:SQL Update Part of XML string in a columnSQL 更新列中 XML 字符串的一部分
【发布时间】:2016-05-10 19:06:32
【问题描述】:

表a:

+------+------+------+--------------------------------------+
| col1 | col2 | col3 | Col4                                 |
+------+------+------+--------------------------------------+
|    1 | A    | E    |<?xml version .....<v> "OOOO"</v></vs>|  
|    2 | B    | F    |<?xml version .....<v> "KKKK"</v></vs>|      
|    3 | C    | G    |<?xml version .....<v> "LLLL"</v></vs>|   
|    4 | B    | E    |<?xml version .....<v> "MMMM"</v></vs>|     
|    5 | T    | G    |<?xml version .....<v> "NNNN"</v></vs>| 
+------+------+------+--------------------------------------+

如何更新“”之间的 xml?

以下是我的尝试,它导致将 col4 更新为 NewValue 1 - x。基本上不保留xml格式。

UPDATE sf
SET sf.col4 = 
 (CASE col4
        WHEN '%OOOO%'
        THEN '%NewValue1%'
        WHEN '%KKKK%'
        THEN '%NewValue2%'
        WHEN '%LLLL%'
        THEN '%NewValue3%'
        WHEN '%MMMM%'
        THEN '%NewValue4%'
        WHEN '%NNNN%'
        THEN '%NewValue5%'
        END)

预期结果:

+------+------+------+-------------------------------------------+
| col1 | col2 | col3 | Col4                                      |
+------+------+------+-------------------------------------------+
|    1 | A    | E    |<?xml version .....<v> "NewValue1"</v></vs>|  
|    2 | B    | F    |<?xml version .....<v> "NewValue2"</v></vs>|      
|    3 | C    | G    |<?xml version .....<v> "NewValue3"</v></vs>|   
|    4 | B    | E    |<?xml version .....<v> "NewValue4"</v></vs>|     
|    5 | T    | G    |<?xml version .....<v> "NewValue5"</v></vs>| 
+------+------+------+-------------------------------------------+

Col4 是数据类型:nvarchar(MAX)

【问题讨论】:

  • 'col4' 的数据类型是什么,预期结果是什么?
  • @RajaYuvi 我希望只有 xml col4 中“”之间的值会更新。比如 而不是

标签: sql sql-server xml sql-server-2008 tsql


【解决方案1】:

如果您想了解使用 XML 功能的解决方案:

DECLARE @tbl TABLE(col1 INT,col2 VARCHAR(10),col3 VARCHAR(10),Col4 XML);
INSERT INTO @tbl VALUES
 (1,'A','E','<?xml version="1.0"?><vs><v> "OOOO"</v></vs>')  
,(2,'B','F','<?xml version="1.0"?><vs><v> "KKKK"</v></vs>')     
,(3,'C','G','<?xml version="1.0"?><vs><v> "LLLL"</v></vs>')  
,(4,'B','E','<?xml version="1.0"?><vs><v> "MMMM"</v></vs>')    
,(5,'T','G','<?xml version="1.0"?><vs><v> "NNNN"</v></vs>');

SELECT * FROM @tbl;

/*
1   A   E   <vs><v> "OOOO"</v></vs>
2   B   F   <vs><v> "KKKK"</v></vs>
3   C   G   <vs><v> "LLLL"</v></vs>
4   B   E   <vs><v> "MMMM"</v></vs>
5   T   G   <vs><v> "NNNN"</v></vs>
*/

现在你查询和更新这个:

WITH MyData AS
(
    SELECT tbl.*
          ,tbl.Col4.value('(/vs/v)[1]','varchar(max)') AS ContentV
    FROM @tbl AS tbl
)
,ExtendedWithNewValue AS
(
    SELECT  *
           ,CASE  WHEN ContentV LIKE '%OOOO%' THEN 'NewValue1'
                  WHEN ContentV LIKE '%KKKK%' THEN 'NewValue2'
                  WHEN ContentV LIKE '%LLLL%' THEN 'NewValue3'
                  WHEN ContentV LIKE '%MMMM%' THEN 'NewValue4'
                  WHEN ContentV LIKE '%NNNN%' THEN 'NewValue5'
                  ELSE ContentV
            END AS NewValue
    FROM MyData
)
UPDATE @tbl
SET col4.modify('replace value of (/vs/v/text())[1] with sql:column("nv.NewValue")')
FROM @tbl AS tbl INNER JOIN ExtendedWithNewValue AS nv ON tbl.col1=nv.col1;

SELECT * FROM @tbl;

/*
col1    col2    col3    Col4
1   A   E   <vs><v>NewValue1</v></vs>
2   B   F   <vs><v>NewValue2</v></vs>
3   C   G   <vs><v>NewValue3</v></vs>
4   B   E   <vs><v>NewValue4</v></vs>
5   T   G   <vs><v>NewValue5</v></vs>
*/

【讨论】:

    【解决方案2】:

    使用Replace

    你可以试试这个:-

    UPDATE sf
    SET    sf.col4 = ( CASE 
                         WHEN col4 like '%OOOO%' THEN Replace(Col4, 'OOOO', 'NewValue1')
                         WHEN col4 like '%KKKK%' THEN Replace(Col4, 'KKKK', 'NewValue2')
                         WHEN col4 like '%LLLL%' THEN Replace(Col4, 'LLLL', 'NewValue3')
                         WHEN col4 like '%MMMM%' THEN Replace(Col4, 'MMMM', 'NewValue4')
                         WHEN col4 like '%NNNN%' THEN Replace(Col4, 'NNNN', 'NewValue5')
                       END ) 
    

    【讨论】:

    • 谢谢,正是我想要的。
    • @AlkippeNikephoros,如果这是您的解决方案 - 太好了!但请记住,通过字符串操作修改 XML 数据可能会带来奇怪的副作用。试想一个 XML 也有你的搜索字符串在另一个地方,或者一个包含“OOOO”“LLLL”的 XML。不知道在您的情况下这是否可行,但我会使用 XML 方法处理 XML 数据...
    猜你喜欢
    • 2022-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多