SQL Ersetzen der statement mit variables

Ich möchte einige Ratschläge, wie man die SQL Replace-statement verwenden, um data mit neuen Wörtern aufzuräumen, die in zwei Spalten in einer separaten Tabelle gehalten werden.

Ich versuche, dynamische SQL und variables zu verwenden, um die replace-statement wie unten zu generieren:

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) 

Dies ist ein Beispiel von dem, was ich bekomme:

@ReplacementText = Ersetzen (@ReplacementText, 'Saiko Maru' ', SAIKO MARU).

plus der Fehler:

Muss die Skalarvariable "@ReplacementText" deklarieren

Dankbar für irgendwelche Tipps, wie man korrigiert, was ich tue oder eine bessere Art, darüber zu gehen.

Ich gebe unten ein Beispiel dafür, wie dies zu tun

 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' 

Beachten Sie, dass zur Veranschaulichung ich #FavouriteFoodQuotes als temporäre Tabelle erstellen musste, sonst wird das dynamische sql nicht laufen. Aber in deinem Fall ist das kein Problem, da du den Wert einer permanenten Tabelle passierst. Auch habe ich eine Tabellenvariable erstellt, um alte und neue Wörter zu halten, aber wieder vermute ich, dass dies dauerhaft sein wird.

Sie müssen das @ im Block entfernen @sql + @ReplacementText = replace( und anstelle des @ReplacementText innerhalb der dynamischen Abfrage müssen Sie es als variableswert als replace(''' + @ReplacementText + ''',

Die Arbeitsabfrage wird sein:

 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) 

Wie ich verstehe, müssen Sie einige Wörter von SELECT UnwantedData FROM Table dieses Teil reinigen.

 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,'') 

In diesem Teil get Abfrage:

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

IN @sql Variable, dann führen Sie es mit Parametern:

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

Ausgabe:

 SELECT Data I want FROM Table