我试图弄清楚如何使用SQL Server中另一个表中的列中的字符替换一个表中的字符。我认为最好的方法是使用游标并运行REPLACE语句,但我不确定语法是什么样的。我在每个表中有很多行,所以我希望能够运行一次并让它循环遍历table1并使用table2中的数据替换应该替换的任何值。我在下面发布了一个我希望我的代码要做的例子。
table1(包含myString列):
myString
your favorite color is blue
his favorite color is red
their favorite color is green
table2(包含origChar和replaceChar列):
origChar replaceChar
blue red
your my
green red
their our
table1 REPLACE后的结果:
myString
my favorite color is red
his favorite color is red
our favorite color is red
以下是我目前工作的一些样本。任何关于如何使这些方法按预期工作的想法。
样本一:
DECLARE @cRowID INT;
DECLARE @cOrigChar VARCHAR(50);
DECLARE @cReplaceChar VARCHAR(50);
DECLARE @cMyString VARCHAR(50);
DECLARE @mapCursor as CURSOR;
SET @mapCursor = CURSOR FOR
SELECT [RowID]
,[myString]
FROM [dbo].[table1];
OPEN @mapCursor;
FETCH NEXT FROM @mapCursor INTO @cRowID,
@cOrigChar,
@cReplaceChar,
@cMyString;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE [dbo].[table1]
SET myString = REPLACE(myString, origChar, replaceChar)
WHERE origChar <> replaceChar
END
CLOSE @mapCursor;
DEALLOCATE @mapCursor;
样本二:
DECLARE @RowID INT = 0
WHILE (1 = 1)
BEGIN
SELECT @RowID = RowID
FROM [dbo].[table1]
WHERE RowID > @RowID
ORDER BY RowID
IF @@ROWCOUNT = 0 BREAK;
UPDATE .[dbo].[table1]
SET myString = REPLACE(myString, origChar, replaceChar)
WHERE origChar <> replaceChar
SELECT TOP 1000 [myString]
FROM [dbo].[table1]
END
答案 0 :(得分:1)
这可能是一种比在游标中更好的方法,但是为了帮助您使用光标方法,循环原始/替换值对而不是循环遍历每个字符串值可能更有意义。你只需要两个变量,即orig / replace,而当你DECLARE
一个游标时,它不会被@
引用。此外,您需要在FETCH
循环中添加WHILE
以便在值对中前进(错过这会导致无限循环):
SET NOCOUNT ON
DECLARE @origChar varchar(MAX)
,@replaceChar varchar(MAX)
DECLARE xyz CURSOR
FOR
SELECT DISTINCT origChar,replaceChar
FROM Table2
OPEN xyz
FETCH NEXT FROM xyz
INTO @origChar,@replaceChar
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Table1
SET myString = REPLACE(myString,@origChar,@replaceChar)
FETCH NEXT FROM xyz
INTO @origChar,@replaceChar
END
CLOSE xyz
DEALLOCATE xyz
GO
演示:SQL Fiddle