[英]How to convert newlines (replace \r\n with \n) across all varchar and nvarchar fields in a database
我正在從我構建的系統中的一個錯誤中恢復過來,我沒有考慮IE生成Windows風格的換行符(\\ r \\ n),而其他瀏覽器在發布帶有文本區域的HTML表單時會生成Unix風格的換行符(\\ n) 。 現在我需要在SQL-Server數據庫的varchar和nvarchar字段中將所有Windows樣式的換行符(\\ r \\ n)轉換為Unix樣式的換行符(\\ n)。
有沒有辦法迭代T-SQL中的所有表/行,並將'\\ r \\ n'的實例替換為'\\ n'為varchar和nvarchar字段?
編輯:我認為替換部分會是這樣的
REPLACE(@fieldContents, CHAR(13)+CHAR(10), CHAR(10))
困難的部分是在所有varchar和nvarchar字段中執行此操作。
像這樣的東西? 然后,您可以動態執行這些字符串,或者只是剪切/粘貼結果並在查詢窗口中執行它們。
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
您可以遍歷INFORMATION_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
如果您有大表,則可能需要很長時間才能運行。 此外,最好只更新每個表一次,而這將為表中的每個字符串列更新一次。 如果我在一個大型數據庫上執行此操作,那么我將更改腳本以解決此問題 - 按表模式和表名稱命令光標,附加到表中每列的字符串的SET部分,僅EXEC(@) cmd)當表更改然后重置您的SET字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.