首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 修改資料庫 COLLATE 定序實戰:系統表直接更新法

     編輯:關於SqlServer

警告: 本文方法涉及直接更新系統表,僅適用於 SQL Server 2000,SQL Server 2005 及以上版本禁止更新系統表,現代版本請使用 ALTER DATABASE ... COLLATE 配合重建表/欄位定序。

適用情境

SQL Server 2000 資料庫定序需從預設值變更為特定定序(如 Finnish_Swedish_CS_AS),且資料庫內物件眾多,逐一重建成本極高。

操作步驟

  1. 確保獨佔存取: 執行 sp_who 查詢連線,對非系統 SPID 執行 KILL @SPID 強制斷開。
  2. 修改資料庫預設定序:
    USE master; GO
    ALTER DATABASE [My_DB] COLLATE Finnish_Swedish_CS_AS; GO
  3. 查詢現有欄位定序 ID:
    USE My_DB; GO
    SELECT DISTINCT collationid FROM syscolumns; -- 記錄舊 collationid
  4. 啟用系統表更新(僅 SQL 2000):
    EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE; GO
  5. 批次更新欄位定序 ID:
    UPDATE syscolumns 
    SET collationid = 49162 -- 新定序 ID (Finnish_Swedish_CS_AS)
    WHERE collationid IN (1359003656); -- 舊定序 ID
    GO
  6. 關閉系統表更新:
    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 時代的系統表直改技巧已成歷史,現代版本請嚴格遵循支援路徑,確保可維護性與升級相容。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved