2016-07-08 7 views
1

ここで見つけた以前に実行された例を使用して、私は入手困難な固有の状況に立ち往生しました。SQL Server 2008再帰的cte文字列元の値を維持する置換

ここで適応コード

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 

結果が

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

私が本当に希望するすべてのヘルプは非常にいくつかの内部で

+0

私はオリジナルを追加しようとしました+ '|' +置き換えますが、再帰エラーが発生します。予想通り。ここには2番目の文字列の例があります String1

答えて

0

を高く評価している

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

ありですh私たちが思いついたelp

    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 
関連する問題