我希望动态地为表格的所有列替换所有列中的普通字符的特殊字符。但它仅适用于硬编码的列
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''
如何使列动态化?
答案 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')
;