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 变量来保存旧词和新词,但我再次认为这将是永久性的。
我想要一些关于如何使用 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 变量来保存旧词和新词,但我再次认为这将是永久性的。