2014-02-10 14 views
0

我遇到問題了!我們有一個具有XML類型列的SQL Server表。此列有許多節點,其中一些節點拼寫錯誤。
我想寫一個腳本,更新所有這種拼寫錯誤!問題是我不知道該怎麼做!
假設XML列中的一個節點名是TEST,其中一些節點的拼寫錯誤值爲MISSPELLED,我希望在更新後將其修改爲CORRECT
這是可能做到的,如果是的話如何?
在此先感謝。
/卡翁達更新XML類型列的值

回答

0

您可以通過以下方式修改XML列中的數據:

CREATE TABLE Test (C1 XML) 
INSERT INTO Test 
VALUES ('<REF> 
      <Person> 
       <FirstName>John</FirstName> 
       <LastName>Smith</LastName> 
       <System> 
        <User><Systemid>System1</Systemid><Type>UserId</Type><Useridentity>Userid1</Useridentity></User> 
        <User><Systemid>System2</Systemid><Type>UserIdx</Type><Useridentity>Userid2</Useridentity></User> 
        <User><Systemid>System2</Systemid><Type>Department</Type><Useridentity>Finance</Useridentity></User> 
        <User><Systemid>System3</Systemid><Type>UserId</Type><Useridentity>Userid3</Useridentity></User> 
        <User><Systemid>System4</Systemid><Type>UserIdx</Type><Useridentity>Userid4</Useridentity></User> 
       </System> 
      </Person> 
     </REF> 
') 


UPDATE [Test] 
SET C1.modify('replace value of (/REF/Person/System/User/Type/text())[1] with "UserId"') 
WHERE C1.value('(/REF/Person/System/User/Type/text())[1]', 'varchar(max)') LIKE '%UserIdx%' 

UPDATE:

對於更新列,你需要編寫腳本像下面多個值:

DECLARE @strSQL NVARCHAR(MAX) 
DECLARE @Index INT 
DECLARE @NodeCount INT 

SET @Index = 1 
SELECT @NodeCount = C1.value('count(/REF/Person/System/User/Type)', 'INT') from Test 

WHILE @Index <= @NodeCount 
BEGIN 
    SET @strSQL = ' UPDATE [Test] 
        SET C1.modify(''replace value of (/REF/Person/System/User/Type/text())[' + CAST(@Index AS VARCHAR(10)) + '] with "UserId"'') 
        WHERE C1.value(''(/REF/Person/System/User/Type/text())[' + CAST(@Index AS VARCHAR(10)) + ']'', ''varchar(max)'') LIKE ''%UserIdx%''' 

    EXEC(@strSQL) 

    SET @Index = @Index + 1 
END 
+0

謝謝Upendra爲您的答覆。一個問題:[1]在你的解決方案中的含義是什麼(在ET C1.modify('(/ Sample/NodeTwo/text())[1]用sql:variable(「@ newValue」)替換值) )? – user3292601

+0

還有一件事:就我而言,每行的XML列中可能有多個拼寫錯誤。 – user3292601

+0

@ user3292601:[1]是該節點的記錄索引。如果有多個具有相同節點的記錄,則使用該索引來獲取數據。如果這是你的情況,那麼請提供你現有的XML,所以我可以指導你 –

0
<REF><Person><FirstName>John</FirstName><LastName>Smith</LastName><System><User><Systemid>System1</Systemid><Type>UserId</Type><Useridentity>Userid1</Useridentity></User><User><Systemid>System2</Systemid><Type>UserIdx</Type><Useridentity>Userid2</Useridentity></User><User><Systemid>System2</Systemid><Type>Department</Type><Useridentity>Finance</Useridentity></User><User><Systemid>System3</Systemid><Type>UserId</Type><Useridentity>Userid3</Useridentity></User><User><Systemid>System4</Systemid><Type>UserIdx</Type><Useridentity>Userid4</Useridentity></User></System></Person></REF>