2013-03-06 92 views
2

我有一个包含文本列的table A。 在我的存储过程中,我有一个临时表,包含两列 - 旧值和新值,有多个行。 我需要使用在我的table A中的文本列中的临时表中指定的新值来替换所有旧值的出现。SQL:使用来自另一个表的新旧值替换列中的文本值

表A中的文本字段与临时表中的oldvalue不同,因此我无法使用联接。文本列的值可能是“没有任何内容”。临时表中可能有一行oldvalue ='there'和newvalue ='here'。 最后,列值应该被替换为'这里什么都没有'。这应该适用于table A中列的所有行。

一种选择是遍历临时表(不是首选)。有没有更好/优雅/优化的方式来做到这一点?

+0

示例数据可能会有所帮助。你的意思是临时表包含例如'(旧的,新的)(狗,狼),(棕色,黑色)',你想更新字符串“快速的棕色狐狸跳过懒惰的狗”到“快速黑狼跳过懒狗“? – 2013-03-06 13:30:28

+0

@MartinSmith - 确实如此。 – ubaid 2013-03-06 13:39:12

+0

可能重复的[用交叉引用临时表 - tsql替换部分字符串大写](http://stackoverflow.com/questions/13918473/replace-part-of-string-with-capitalised-equivalent-from-cross -ref-temp-table -t) – 2013-03-06 13:45:42

回答

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) 
+0

表A中的文本字段与临时表中的oldvalue不同,因此我无法使用联接。文本列的值可能是“没有任何内容”。临时表中可能有一行oldvalue ='there'和newvalue ='here'。现在,输出应该是'这里没有什么'。这应该适用于表A中列的所有行。希望我有道理。 :) – ubaid 2013-03-06 13:32:12

+0

尝试显示一些示例数据..因为我不明白。这会将新值与表a中的旧值相匹配 – 2013-03-06 13:34:44

+0

通过示例编辑我的评论。 – ubaid 2013-03-06 13:35:25

相关问题