您可以為資料表的特定資料行指定不同的定序,並使用下列其中一項來覆寫 char、varchar、text、nchar、nvarchar 和 ntext 資料的資料庫定序:
CREATE TABLE 和 ALTER TABLE 的 COLLATE 子句。 例如:
CREATE TABLE dbo.MyTable (PrimaryKey int PRIMARY KEY, CharCol varchar(10) COLLATE French_CI_AS NOT NULL ); GO ALTER TABLE dbo.MyTable ALTER COLUMN CharCol varchar(10)COLLATE Latin1_General_CI_AS NOT NULL; GOSQL Server Management Studio。 如需詳細資訊, 請參閱定序和 Unicode 支援。
在 SQL Server 管理物件(SMO)中使用
Column.Collation屬性。
無法變更目前由下列任何一個項目參考的資料行定序:
計算資料行
索引
分佈統計數據可以自動產生,或者透過 CREATE STATISTICS 語句產生。
檢查條件約束
外鍵約束
當您使用 tempdb時, COLLATE 子句會包含 database_default 選項,將暫存資料表中的資料行指定為使用連線的目前使用者資料庫預設定序,而非 tempdb的定序。
定序與文字資料行
您可以在定序不同於資料庫預設定序的代碼頁的數據列中 text 插入或更新值。 SQL Server 以隱含方式將該值轉換為資料行的定序。
定序與 tempdb
tempdb 資料庫會在每次 SQL Server 啟動時建置,且預設定序與 model 資料庫相同。 通常與執行個體的預設定序相同。 如果建立使用者資料庫,並指定與 model不同的預設定序,使用者資料庫的預設定序就會與 tempdb不同。 所有暫存預存程序或暫存資料表會在 tempdb中建立及儲存。 這表示暫存資料表中所有隱含的資料行,與暫存預存程序中所有可強迫的常數、變數與參數,都會與建在永久資料表和預存程序中的同等物件具有不同的定序。
這將造成使用者自訂資料庫與系統資料庫物件之間的定序不相符。 例如,SQL Server 執行個體使用 Latin1_General_CS_AS 定序,而您執行下列陳述式:
CREATE DATABASE TestDB COLLATE Estonian_CS_AS;
USE TestDB;
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );
在此系統中, tempdb 資料庫使用 Latin1_General_CS_AS 定序與字碼頁 1252,而 TestDB 和 TestPermTab.Col1 使用 Estonian_CS_AS 定序與字碼頁 1257。 例如:
USE TestDB;
GO
-- Create a temporary table with the same column declarations
-- as TestPermTab
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );
INSERT INTO #TestTempTab
SELECT * FROM TestPermTab;
GO
承上例, tempdb 資料庫使用 Latin1_General_CS_AS 定序,而 TestDB 和 TestTab.Col1 則使用 Estonian_CS_AS 定序。 例如:
SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;
因為 tempdb 使用預設伺服器定序,而 TestPermTab.Col1 使用不同的定序,所以 SQL Server 會傳回此錯誤訊息:「無法解析 'Latin1_General_CI_AS_KS_WS' 與 'Estonian_CS_AS' 之間在相等運算中的定序衝突」。
為避免此錯誤,您可以使用以下任一種替代方法:
指定暫存資料表的資料行使用使用者資料庫的預設排序規則,而非 tempdb的預設排序規則。 這使得暫存資料表可配合多個資料庫中格式類似的資料表 (如果系統有這樣的需求)。
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar COLLATE database_default );為
#TestTempTab資料行指定正確的定序:CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar COLLATE Estonian_CS_AS );