2

テキスト列をtable A含む があります。私のストアド プロシージャには、古い値と新しい値の 2 つの列を含む一時テーブルがあり、多数の行があります。私のtable A.

テーブル A のテキスト フィールドは、一時テーブルの古い値と同じではないため、結合を使用できません。テキスト列の値は、「そこには何もありません」である可能性があります。一時テーブルに oldvalue='there' および newvalue='here' の行が存在する可能性があります。最後に、列の値を「here is nothing here」に置き換える必要があります。これは、 の列のすべての行に適用する必要がありますtable A

1 つのオプションは、一時テーブルを反復処理することです (好ましくありません)。それを行うためのより良い/エレガントな/最適化された方法はありますか?

4

1 に答える 1

1

これでうまくいくはずです。

;with r as (
  select 
    row_number() over(order by oldv) rn
    ,oldv
    ,newv
  from #replacevalues
)
,
res as (
  select 
    0 as ver
    ,txt as oldcte
    ,txt as newcte
  from tablea
  union all
  select 
    ver+1
    ,oldcte
    ,replace(newcte,oldv,newv)
  from res 
  join r 
    on r.rn=ver+1
)
update t
  set txt = res.newcte
from tablea t
join res on t.txt = res.oldcte
where res.ver = (select max(ver) from res)
于 2013-03-06T13:28:29.173 に答える