SQL 使用变量替换语句

SQL replace statement using variables

我想要一些关于如何使用 SQL 替换语句来清理包含在单独 table 的两列中的新词数据的建议。

我正在尝试使用动态 SQL 和变量来生成替换语句,如下所示:

DECLARE @ReplacementText VARCHAR(max) = 'SELECT UnwantedData FROM Table'

DECLARE @sql VARCHAR(8000) = 'SELECT '

SELECT 
  @sql = @sql + 
  ' @ReplacementText = replace(@ReplacementText, ''' + OldWord + ''', ' + NewWord + ')'
    + ' ,'
FROM ReplacementWords

PRINT @sql

EXEC(@sql)

这是我得到的示例:

@ReplacementText = replace(@ReplacementText, ' “Saiko Maru”', SAIKO MARU).

加上错误:

Must declare the scalar variable "@ReplacementText"

感谢任何有关如何纠正我正在做的事情或更好的方法的提示。

您需要删除块 @sql + @ReplacementText = replace( 中的 @ 而不是动态查询中的 @ReplacementText,您需要将其设为变量值 replace(''' + @ReplacementText + ''',

工作查询将是:

DECLARE @ReplacementText VARCHAR(max) = 'SELECT UnwantedData FROM Table';
DECLARE @sql VARCHAR(8000) = 'SELECT '

SELECT @sql = @sql + 'ReplacementText = replace(''' + @ReplacementText + ''', ''' + OldWord + ''', ''' + NewWord + ''')' + ' ,'
FROM ReplacementWords

PRINT @sql

EXEC (@sql)

据我所知,您需要清理 SELECT UnwantedData FROM Table 这部分的一些词。

DECLARE @DataToClean NVARCHAR(max)  = 'SELECT UnwantedData FROM Table',
        @ReplacementText NVARCHAR(max),
        @ParmDefinition NVARCHAR(500),
        @sql NVARCHAR(max) = ' @DataToClean, '

;WITH ReplacementWords AS ( --it is a sample of your table with words
SELECT ' “Saiko Maru”' as OldWord,'SAIKO MARU' as NewWord
UNION ALL
SELECT 'UnwantedData', 'Data I want' --this will work for query above
UNION ALL
SELECT 'Some More', 'Yeah'
)

SELECT  @sql = 'replace(' + @sql + '''' + OldWord + ''', ''' + NewWord + '''),'
FROM ReplacementWords

SET @ParmDefinition = N'@DataToClean NVARCHAR(max),@ReplacementText nvarchar(max) OUTPUT'

SELECT @sql = 'SELECT @ReplacementText = ' + STUFF(@sql,LEN(@sql),1,'')

这部分你会得到查询:

SELECT @ReplacementText =  replace(replace(replace( @DataToClean, ' “Saiko Maru”', 'SAIKO MARU'),'UnwantedData', 'Data I want'),'Some More', 'Yeah')   

IN @sql变量,然后带参数执行:

EXEC sp_executesql @sql, @ParmDefinition, @DataToClean = @DataToClean, @ReplacementText = @ReplacementText OUTPUT

SELECT @ReplacementText

输出:

SELECT Data I want FROM Table

我在下面给出了一个如何做到这一点的例子。

CREATE PROCEDURE demoReplace(

@tableName varchar(20), 
@fieldName varchar(20)
)
AS 

DECLARE @replacementWords table (
oldWord varchar(50),
newWord varchar(50)
)

INSERT INTO @replacementWords VALUES ('pudding', 'custard')
INSERT INTO @replacementWords VALUES ('madras', 'vindaloo')

CREATE TABLE #favouriteFoodQuotes (
myFavourite varchar(max)
)

INSERT INTO #favouriteFoodQuotes VALUES ('I adore pudding')
INSERT INTO #favouriteFoodQuotes VALUES ('My dad eats chicken madras every day')

DECLARE @oldWord varchar(50)
DECLARE @newWord varchar(50)

DECLARE @sql varchar(max)

DECLARE repCursor CURSOR FOR 
    SELECT oldWord, newWord FROM @replacementWords


OPEN repCursor

FETCH NEXT FROM repCursor INTO @oldWord, @newWord

WHILE @@FETCH_STATUS = 0  
BEGIN  
    SET @sql = 'UPDATE ' + @tableName + ' SET ' + @fieldName 
    + ' = REPLACE(' + @fieldName + ', ''' + @oldWord + ''', ''' + @newWord + ''')'
    EXEC(@sql)
    FETCH NEXT FROM repCursor INTO @oldWord, @newWord
END
CLOSE repCursor
DEALLOCATE repCursor

SELECT * FROM #favouriteFoodQuotes

DROP TABLE #favouriteFoodQuotes

--exec demoReplace '#favouriteFoodQuotes', 'myFavourite'

请注意,为了便于说明,我必须将#favouriteFoodQuotes 创建为临时 table,否则动态 sql 将不会 运行。但在您的情况下,这没有问题,因为您将传递永久 table 的值。我还创建了一个 table 变量来保存旧词和新词,但我再次认为这将是永久性的。