我有两个表格如下所示:
表1:Test1
Create table Test1
(
name varchar(50)
);
插入:
insert into Test1 values('a$xyz');
insert into Test1 values('xyz$a');
表2:Test2
create table Test2
(
pattern varchar(50)
);
插入:
insert into Test2 values('a$');
insert into Test2 values('$a');
现在我想update
表格Test1
。具体来说,我想通过替换表Test2
的模式来更新表中的名称。
像:
update Test2
set name = replace(name,'a$','');
如何从表string_to_replace
中获取Test2
?据我所知,我们无法在SELECT
函数中使用REPLACE
。
答案 0 :(得分:2)
WHILE ( 1 = 1 )
BEGIN
UPDATE Test1
SET Test1.NAME = Replace(Test1.NAME, Test2.pattern, '')
FROM Test1,
Test2
WHERE ( Test1.NAME LIKE '%' + Test2.pattern + '%' )
IF @@rowcount = 0
BREAK
END
SELECT *
FROM Test1
<强> SQL Fiddle 强>
答案 1 :(得分:2)
此脚本只会更新每一行。
创建此功能:
CREATE FUNCTION f_test
(
@a varchar(50)
)
returns varchar(50)
AS
BEGIN
SELECT @a = replace(@a, pattern, '')
FROM test2
RETURN @a
END
这样称呼:
UPDATE test1
SET name = dbo.f_test(name)
编辑:
这可能更有效,而不是更新所有行,因为它只更新相关的行:
;WITH CTE as
(
SELECT name, dbo.f_test(name) namenew
FROM test1
)
UPDATE CTE
SET name = namenew
WHERE name <> namenew
答案 2 :(得分:1)
我认为这就是你要找的东西。
Update t1
set t1.name = replace(name,t2.pattern,'')
from Test1 t1 , Test2 t2
where t1.name like '%'+t2.pattern+'%'
select * from Test1
检查sqlfiddle:http://www.sqlfiddle.com/#!3/eda97/6
答案 3 :(得分:1)
或者,使用游标多次遍历所有替换:
DECLARE @pat varchar(8)
DECLARE patc CURSOR FOR SELECT pattern FROM test2
OPEN patc
FETCH NEXT FROM patc INTO @pat
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE test1 SET name=REPLACE(name,@pat,'')
FETCH NEXT FROM patc INTO @pat
END
SELECT * FROM test1
也许有点&#34;很多&#34;代码,但它有效,请参见此处:http://www.sqlfiddle.com/#!3/7289c/2
Deepanshu Kalra和Mukund之前的解决方案对您的示例工作得很好,因为在每种情况下都可以找到大多数模式。对于可能在单个单词中找到(并应用)多个模式的更一般情况,cursor
方法是更通用的解决方案。