为表的所有列动态更新特殊字符列?

时间:2016-02-22 10:29:19

标签: sql sql-server special-characters

我希望动态地为表格的所有列替换所有列中的普通字符的特殊字符。但它仅适用于硬编码的列

 alter proc dbo.specialcharacterreplacer
@tblname varchar(1000),
@column_name varchar(1000)
as
begin

declare @Sql VARCHAR(MAX)
set @Sql = '
UPDATE ' + @tblname + ' SET ' + @column_name+ ' = REPLACE('+@column_name + ', ' + '''ó'''+ ', '+'''o'''+') 
UPDATE ' + @tblname + ' SET ' + @column_name+ ' = REPLACE('+@column_name + ', ' + '''ò'''+ ', '+'''o'''+') 
UPDATE ' + @tblname + ' SET ' + @column_name+ ' = REPLACE('+@column_name + ', ' + '''ö'''+ ', '+'''o'''+') 
UPDATE ' + @tblname + ' SET ' + @column_name+ ' = REPLACE('+@column_name + ', ' + '''ð'''+ ', '+'''o'''+') 
 exec (@sql)

end
go
EXEC dbo.specialcharacterreplacer @tblname = 'dirtyyyysource', @column_name ='select *from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '@tblname'' 

如何使列动态化?

1 个答案:

答案 0 :(得分:1)

这是动态获取给定表的所有列的更新语句的中心代码。请注意TABLE_SCHEMA和列的类型。您可以在WHERE部分使用一些附加内容...(在我的示例中,您也尝试替换INT列...)

您可以在这里查看:https://stackoverflow.com/a/32048968/5089204

在那里,你会找到我之前对类似问题的回答之一,并展示如何创建一个可以一次取代几个特殊字符的功能的方法。

CREATE TABLE dbo.TestTable(ID INT,Test1 VARCHAR(100), Test2 VARCHAR(100));
GO

declare @tblname varchar(1000)='TestTable';
declare @tblschema varchar(1000)='dbo'; 

DECLARE @SqlCmd VARCHAR(MAX)= 'UPDATE ' + @tblname + ' SET ' +
(
    STUFF(
         (
            SELECT ',' + COLUMN_NAME + ' = REPLACE(' + COLUMN_NAME + ', ' + '''ó'', ''o'''+')'+ CHAR(10) --might need to use CHAR(13)+CHAR(10)
            FROM INFORMATION_SCHEMA.COLUMNS 
            WHERE TABLE_SCHEMA=@tblschema AND TABLE_NAME = @tblname
            FOR XML PATH('')
         ),1,1,'')  + ';'
);

SELECT @SqlCmd;
GO

DROP TABLE dbo.TestTable;
GO

结果:

UPDATE TestTable SET ID = REPLACE(ID, 'ó', 'o')
,Test1 = REPLACE(Test1, 'ó', 'o')
,Test2 = REPLACE(Test2, 'ó', 'o')
;