Оператор замены SQL с использованием переменных

Я хотел бы получить несколько советов о том, как использовать оператор замены SQL для очистки данных новыми словами, которые хранятся в двух столбцах в отдельной таблице.

Я пытаюсь использовать динамический SQL и переменные для генерации оператора replace, как показано ниже:

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).

плюс ошибка:

Должен объявить скалярную переменную "@ReplacementText"

Благодарны за любые советы о том, как исправить то, что я делаю, или о лучшем способе этого.

Ниже приводится пример того, как это сделать.

 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 в качестве временной таблицы, иначе динамический sql не будет запущен. Но в вашем случае это не проблема, так как вы будете передавать значение постоянной таблицы. Также я создал переменную таблицы для хранения старых и новых слов, но, опять же, я предполагаю, что это будет постоянным.

Вам нужно удалить @ в блоке @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 
  • Конструкция иерархической структуры данных (вложенные наборы)
  • Использовать журналы таблиц, функций, хранимых процедур, представлений и т. Д.
  • SQL Server: отдельные схемы или отдельные базы данных
  • Автоматизация генерации диаграммы базы данных SQL Server
  • что означает одно к одному отображению таблицы?
  • Таблица, на которую ссылаются другие таблицы, имеющие разные PK
  • создание таблицы в оракуле с использованием таблицы sql-сервера
  • Строка SQL Server или двоичные данные будут усечены
  • Как обеспечить соблюдение правил целостности данных в моей базе данных?
  • дизайн данных для различных типов отчетов
  • Каков наилучший способ хранения различных изображений в базе данных?
  • Давайте будем гением компьютера.