Boucle SQL sur les colonnes et instruction REPLACE

J'essaie de replace un caractère CRLF dans une table dans SQL Server. La déclaration pour une colonne fonctionne et va comme ceci:

select REPLACE(REPLACE(col_name,char(13),''), char(10), '') from table_name 

Maintenant, je voudrais répéter cela pour chaque colonne de ma table. J'ai le script suivant qui ne fonctionne pas:

 Declare @sql varchar(max) = '' select @sql = @sql + 'select [' + c.name + '] REPLACE(REPLACE(' + c.name + ', char(13),''), char(10), '') from [' + t.name + ']; ' from sys.columns c inner join sys.tables t on c.object_id = t.object_id where t.name = table_name EXEC (@sql) 

Malheureusement, cela ne fonctionne pas et j'obtiens l'erreur suivante:

 Msg 102, Level 15, State 1, Line 24 Incorrect syntax near 'REPLACE'. Msg 102, Level 15, State 1, Line 24 Incorrect syntax near 'REPLACE'. Msg 102, Level 15, State 1, Line 24 Incorrect syntax near 'REPLACE'. Msg 102, Level 15, State 1 

Deux choses; comme noté par l'autre réponse, il doit y avoir une virgule après le nom initial [c.name] . De plus, pour get une seule citation dans la string, vous avez besoin de deux guillemets simples. Par conséquent, pour get deux guillemets simples, vous avez besoin de quatre guillemets simples.

 select @sql = @sql + 'select [' + c.name + '], REPLACE(REPLACE(' + c.name + ', char(13),''''), char(10), '''') from [' + t.name + ']; ' from sys.columns c inner join sys.tables t on c.object_id = t.object_id where t.name = 'table_name' exec (@sql) 

NB: print(@sql) est une aide print(@sql) pour le debugging de tels problèmes!

Ajoutez des guillemets, supprimez d'abord c.name ou ajoutez une virgule, au lieu d'append [] use QUOTENAME:

 Declare @sql varchar(max) = '' select @sql = @sql + 'select ' + QUOTENAME(c.name) + ', REPLACE(REPLACE(' + QUOTENAME(c.[name]) + ', char(13),''''), char(10), '''') from ' + QUOTENAME(t.[name]) + '; ' from sys.columns c inner join sys.tables t on c.object_id = t.object_id where t.[name] = 'table_name' EXEC (@sql) 

MODIFIER

Si vous devez mettre à jour la partie change @sql :

 select @sql = @sql + 'UPDATE ' + QUOTENAME(t.[name]) + ' SET ' + QUOTENAME(c.name) + ' = REPLACE(REPLACE(' + QUOTENAME(c.[name]) + ', char(13),''''), char(10), '''') ; ' 

Vous pouvez essayer de cette façon, la variable n'est pas définie avec la valeur remplacée, les guillemets ne sont pas entre guillemets …

 Declare @sql varchar(max) = '' select @sql = @sql + 'select [' + c.name + '] = REPLACE(REPLACE(' + c.name + ', char(13),''''), char(10), '''') from [' + t.name + ']; ' from sys.columns c inner join sys.tables t on c.object_id = t.object_id where t.name = 'commasep' select @sql