2016-07-08 11 views
1

Mit einem zuvor durchgeführten Beispiel hier gefunden, blieb ich mit einer einzigartigen Situation stecken Ich habe Schwierigkeiten, durch. HierSQL Server 2008 rekursive cte string ersetzen unter Beibehaltung der ursprünglichen Wert

ist der adaptierte Code

declare @RandomString table (ID int not null,ItemValue varchar(500) not null) 

insert into @RandomString(ID,ItemValue) 
values (1,'<Strings><B1>String1</B1><B2>String2</B2><B3>String3</B3><B4>String4</B4></Strings>') 

declare @SearchCharReplacement table (Original varchar(500) not null,Replacement varchar(500) not null) 

Insert into @SearchCharReplacement(Original, Replacement) 
values ('String1', 'abc'), ('String2', 'efg'), 
     ('String3', 'hij'), ('String4', 'klm') 

;With Replacements as (
select ID,ItemValue,0 as RepCount 
from @RandomString 
union all 
select ID,SUBSTRING(REPLACE(ItemValue,Original, Replacement),1,500),rs.RepCount+1 
from Replacements rs 
inner join @SearchCharReplacement scr on CHARINDEX(scr.Original,rs.ItemValue) > 0 
) 

, FinalReplacements as (
select ID,ItemValue,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RepCount desc) as rn 
from Replacements 
) 

update rs set ItemValue = fr.ItemValue 
from @RandomString rs 
inner join FinalReplacements fr on rs.ID = fr.ID and rn = 1 

select * from @RandomString 

Ergebnis

<Strings><B1>abc</B1><B2>def</B2><B3>ghi</B3><B4>jkl</B4></Strings> 

ist, was ich wirklich möchte ist

<Strings><B1>String1|abc</B1><B2>String2|def</B2><B3>String3|ghi</B3><B4>String4|jkl</B4></Strings> 

Jede Hilfe sehr geschätzt wird

+0

Ich habe versucht, Original + '|' + Ersetzung, aber einen Rekursionsfehler erhalten. Wie man es erwarten würde. Hier ist ein 2. String Beispiel String1

Antwort

0

Mit einigen internen h elp wir kamen mit

    Declare @XMLData Varchar(max) = N'<JEI><B1>String1</B1><B2>String2</B2><B3>FRED</B3><B4/></JEI>' 
       Declare @T Table(XMLCol xml) 
       Insert into @T select @XMLData 

       declare @SearchCharReplacement table (Original varchar(500) not null, Replacement varchar(500) not null) 

       Insert into @SearchCharReplacement(Original, Replacement) 
       values ('String1', 'abc'), ('String2', 'efg'), 
          ('String3', 'hij'), ('String4', 'klm') 

       ;With Strings as 
       (
         SELECT a.value('B1[1]', 'varchar(15)') as B1 
             ,a.value('B2[1]', 'varchar(15)') as B2 
             ,a.value('B3[1]', 'varchar(15)') as B3 
             ,a.value('B4[1]', 'varchar(15)') as B4 
             ,CAST(XMLData.XMLCol as varchar(max)) as Data 
             FROM @T as XMLData 
             Cross APPLY XmlData.XMLCol.nodes('/JEI') AS JEI(a) 


       ) 
       --SELECT * from strings 
       SELECT * 
         ,REPLACE(  
           REPLACE(
            REPLACE(
              REPLACE(ST.Data, 
              ST.B1, COALESCE(ST.B1 + '|' + SCR1.Replacement ,ST.B1)) 
              ,ST.B2, COALESCE(ST.B2 + '|' + SCR2.Replacement, ST.B2)) 
              ,ST.B3, COALESCE(ST.B3 + '|' + SCR3.Replacement, ST.B3)) 
              ,ST.B4, COALESCE(ST.B4 + '|' + SCR4.Replacement, ST.B4)) 
         AS x 
       FROM @T RS 
       CROSS JOIN Strings ST 
       LEFT OUTER JOIN @SearchCharReplacement SCR1 
         on SCR1.Original = ST.B1 
       LEFT OUTER JOIN @SearchCharReplacement SCR2 
         on SCR2.Original = ST.B2 
       LEFT OUTER JOIN @SearchCharReplacement SCR3 
         on SCR3.Original = ST.B3 
       LEFT OUTER JOIN @SearchCharReplacement SCR4 
         on SCR4.Original = ST.B4 
Verwandte Themen