SQL Server 2008 R2:在REPLACE()中选择语句

时间:2015-08-04 08:09:29

标签: sql-server sql-server-2008-r2

我有两个表格如下所示:

表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

4 个答案:

答案 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方法是更通用的解决方案。