您可以遍歷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字符串。
真棒的想法,我喜歡創造力和簡潔。謝謝。 注意:我在('my_schema-1','my_schema_2',...)「中的where sc.name表單的底部添加了一個條件,以將其限制爲我自己的模式。我還在第一行的字符串末尾添加了分號,以允許在查詢窗口中粘貼和運行結果。 – 2010-06-24 18:55:21