Sql 如何跨数据库中的所有varchar和nvarchar字段转换换行符(将\r\n替换为\n)

Sql 如何跨数据库中的所有varchar和nvarchar字段转换换行符(将\r\n替换为\n),sql,sql-server,tsql,newline,Sql,Sql Server,Tsql,Newline,我正在从我构建的系统中的一个错误中恢复过来,我没有考虑到IE在发布带有文本区域的HTML表单时生成Windows样式的换行符(\r\n)和其他浏览器生成Unix样式的换行符(\n)。现在,我需要在SQL Server数据库的varchar和nvarchar字段中将所有Windows样式的换行符(\r\n)转换为Unix样式的换行符(\n) 是否有方法迭代T-SQL中的所有表/行,并将varchar和nvarchar字段的“\r\n”实例替换为“\n” 编辑:我想替换的部分应该是 REPLACE(

我正在从我构建的系统中的一个错误中恢复过来,我没有考虑到IE在发布带有文本区域的HTML表单时生成Windows样式的换行符(\r\n)和其他浏览器生成Unix样式的换行符(\n)。现在,我需要在SQL Server数据库的varchar和nvarchar字段中将所有Windows样式的换行符(\r\n)转换为Unix样式的换行符(\n)

是否有方法迭代T-SQL中的所有表/行,并将varchar和nvarchar字段的“\r\n”实例替换为“\n”

编辑:我想替换的部分应该是

REPLACE(@fieldContents, CHAR(13)+CHAR(10), CHAR(10))

最困难的部分是跨所有varchar和nvarchar字段执行此操作。

您可以在INFORMATION\u SCHEMA中迭代系统视图,并运行动态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

如果您有大型表,这可能需要很长时间才能运行。此外,最好只更新每个表一次,而这将为表中的每个字符串列更新一次。如果我在一个大型数据库上执行此操作,那么我会更改脚本以说明这一点-按表架构和表名对光标进行排序,将光标附加到表中每个列的字符串的集合部分,当表更改时仅执行EXEC(@cmd),然后重置您的集合字符串。

类似的内容?然后,您可以动态执行这些字符串,或者只是剪切/粘贴结果并在查询窗口中执行它们

select 'update ' + sc.name + '.' + t.name + ' set ' + c.name + ' = replace(' + c.name + ', CHAR(13)+CHAR(10), CHAR(10))'
from sys.columns c
    inner join sys.systypes st
        on c.system_type_id = st.xtype
            and CHARINDEX('varchar', st.name) <> 0
    inner join sys.tables t
        on c.object_id = t.object_id
    inner join sys.schemas sc
        on t.schema_id = sc.schema_id
选择“更新”+sc.name+”。+t.name+“设置”+c.name+”=replace(“+c.name+”,CHAR(13)+CHAR(10),CHAR(10))'
来自sys.c列
内部连接sys.systypes st
在c.system\u type\u id=st.xtype上
和CHARINDEX('varchar',圣名)0
内部联接sys.t表
在c.object\u id=t.object\u id上
内部联接sys.sc
在t.schema_id=sc.schema_id上

是的,我已修改了客户端代码,以便在表单提交时\r\n替换为。。。但到目前为止,我仍然保留着数据库中生成的所有文本。好主意,我喜欢创意和简洁。非常感谢。注意:我在表单底部添加了一个条件“where sc.name in('my_schema-1'、'my_schema_2'、…)”以将其限制为我自己的模式。我还在第一行的字符串末尾添加了分号,以允许在查询窗口中粘贴和运行结果。