如何更改 SQL Server 資料庫的排序規則?

如何更改 SQL Server 資料庫的排序規則?

我試圖將所有資料庫標準化為單一排序規則 - Latin1_General_CI_AS (標準排序規則)。我有一些位於 SQL_Latin1_General_CP1_CI_AS 中的資料庫。

我知道我可以使用 ALTER DATABASE 來更改資料庫排序規則,但這只會影響新物件。我的理解是,更改現有列的唯一方法是對每個表中的每一列執行 ALTER COLUMN - 而且我需要刪除並重新建立所有索引才能做到這一點。

我想它看起來會是這樣的:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

並對整個資料庫中的每個 varchar、char、text、nvarchar、nchar 和 ntext 列重複此操作。那將是一個巨大的SQL 腳本。

有沒有更簡單的方法來做到這一點,或者有人可以建議一種自動建立 SQL 腳本來執行此操作的方法嗎?

答案1

微軟知識庫 325335有關於如何對整個資料庫和所有列執行此操作的選項。

基本上:

  1. 編寫資料庫表格腳本(使用新排序規則)
  2. DTS/SSIS資料(觀看整理)
  3. 新增約束

答案2

它可能需要一些調整,但我成功地使用了“SQL Server 2000 Collat​​ion Changer”實用程式: http://www.codeproject.com/KB/database/ChangeCollat​​e.aspx

答案3

不幸的是,這在 SQL Server 中並不是一件容易的事。

您可以對現有資料庫物件(表格、預存程序、檢視等)使用 Redgate 的 SQL Compare 等腳本編寫工具。使用正確的排序規則建立新資料庫並從腳本重建物件後,您可以執行 SSIS 將資料從一個資料庫傳輸到另一個資料庫。如果您有大量數據,請使用 T-SQL 批量插入。

為了為該伺服器上的未來資料庫提供正確的排序規則,您可以變更伺服器上的預設排序規則。以下 MSDN 文章解釋了使用 ALTER DATABASE 和 ALTER TABLE 的 COLLATE 子句進行的變更:

設定和變更資料庫排序規則(SQL Server 2008 線上叢書)

您可以使用下列命令的 COLLATE 子句變更在使用者資料庫中建立的任何新物件的排序規則修改資料庫陳述。此語句不會變更任何現有使用者定義表中列的排序規則。這些可以透過使用 COLLATE 子句來更改修改表

當您變更資料庫排序規則時,您將變更以下內容:

  • 資料庫的預設排序規則。此新的預設排序規則將套用於隨後在資料庫中建立的所有欄位、使用者定義的資料類型、變數和參數。當根據資料庫中定義的物件解析 SQL 語句中指定的物件標識符時,也會使用它。
  • 系統表中的任何 char、varchar、text、nchar、nvarchar 或 ntext 欄位都會變更為新排序規則。
  • 預存程序和使用者定義函數的所有現有 char、varchar、text、nchar、nvarchar 或 ntext 參數以及標量傳回值均變更為新排序規則。
  • char、varchar、text、nchar、nvarchar 或 ntext 系統資料類型以及基於這些系統資料類型的所有使用者定義的資料類型均變更為新的預設排序規則。

答案4

試試這個實用程序,給定來源資料庫將產生應用於目標資料庫所需的所有腳本,以便安全地變更排序規則。

相關內容