SQL Server REPLACE不同表中的字符

时间:2014-03-10 03:57:41

标签: sql sql-server replace cursor

我试图弄清楚如何使用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

1 个答案:

答案 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