警告: 本文方法涉及直接更新系統表,僅適用於 SQL Server 2000,SQL Server 2005 及以上版本禁止更新系統表,現代版本請使用 ALTER DATABASE ... COLLATE 配合重建表/欄位定序。
SQL Server 2000 資料庫定序需從預設值變更為特定定序(如 Finnish_Swedish_CS_AS),且資料庫內物件眾多,逐一重建成本極高。
sp_who 查詢連線,對非系統 SPID 執行 KILL @SPID 強制斷開。USE master; GO
ALTER DATABASE [My_DB] COLLATE Finnish_Swedish_CS_AS; GO
USE My_DB; GO
SELECT DISTINCT collationid FROM syscolumns; -- 記錄舊 collationid
EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE; GO
UPDATE syscolumns
SET collationid = 49162 -- 新定序 ID (Finnish_Swedish_CS_AS)
WHERE collationid IN (1359003656); -- 舊定序 ID
GO
EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE; GO
DBCC CHECKDB 驗證一致性。-- 1. 修改資料庫預設定序 (僅影響後續新建欄位)
ALTER DATABASE [MyDB] COLLATE Chinese_PRC_CI_AS;
-- 2. 現有欄位需逐一 ALTER COLUMN 重建定序
ALTER TABLE [Schema].[Table] ALTER COLUMN [Col] NVARCHAR(100) COLLATE Chinese_PRC_CI_AS;
-- 3. 可用腳本批次產生所有字串欄位的 ALTER 指令
SELECT 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name)
+ ' ALTER COLUMN ' + QUOTENAME(c.name) + ' ' +
UPPER(TYPE_NAME(c.system_type_id)) +
CASE WHEN c.max_length = -1 THEN '(MAX)' ELSE '(' + CAST(c.max_length/2 AS VARCHAR) + ')' END
+ ' COLLATE Chinese_PRC_CI_AS' + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END + ';'
FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.collation_name IS NOT NULL AND c.collation_name <> 'Chinese_PRC_CI_AS';
SQL Server 2000 時代的系統表直改技巧已成歷史,現代版本請嚴格遵循支援路徑,確保可維護性與升級相容。