您可以遍历Information_模式中的系统视图,并运行动态SQL来执行此操作。相关视图应该是information_schema.columns。
更好的方法可能是让您的UI在必须显示值时处理它。您是否有一种方法来防止类似的值将来进入数据库?
下面是一些示例代码,可以帮助您开始:
DECLARE
@table_schema SYSNAME,
@table_name SYSNAME,
@column_name SYSNAME,
@cmd VARCHAR(MAX)
DECLARE cur_string_columns AS
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
DATA_TYPE IN ('VARCHAR', 'CHAR') AND -- NVARCHAR and NCHAR?
CHARACTER_MAXIMUM_LENGTH > 1
OPEN cur_string_columns
FETCH NEXT FROM cur_string_columns INTO @table_schema, @table_name, @column_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @cmd = 'UPDATE
' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + '
SET ' + QUOTENAME(@column_name) + ' = REPLACE(' + QUOTENAME(@column_name) + ', CHAR(13) + CHAR(10), CHAR(10))'
EXEC(@cmd)
FETCH NEXT FROM cur_string_columns INTO @table_schema, @table_name, @column_name
END
CLOSE cur_string_columns
DEALLOCATE cur_string_columns
如果您有大桌子,这可能需要很长时间才能运行。此外,最好只更新每个表一次,而这将为表中的每个字符串列更新一次。如果我在一个大型数据库上执行此操作,那么我会将脚本更改为相应的脚本-按表架构和表名对光标进行排序,为表中的每一列附加到字符串的集合部分,只有当表更改时才执行(@cmd),然后重置集合字符串。