列の照合順序の設定と変更
char 型、varchar 型、text 型、nchar 型、nvarchar 型、および ntext 型のデータのデータベース照合順序は、テーブルの特定の列の照合順序を指定し、次のいずれかを使用することで上書きできます。
CREATE TABLE と ALTER TABLE の COLLATE 句。次に例を示します。
CREATE TABLE MyTable (PrimaryKey int PRIMARY KEY, CharCol varchar(10) COLLATE French_CI_AS NOT NULL ) GO ALTER TABLE MyTable ALTER COLUMN CharCol varchar(10)COLLATE Latin1_General_CI_AS NOT NULL GO
SQL Server Management Studio。詳細については、「テーブル列のプロパティ (SQL Server Management Studio)」を参照してください。
SQL Server 管理オブジェクト (SMO) の column.collation プロパティ。
次のいずれかから現在参照されている列は、照合順序を変更することはできません。
- 計算列
- インデックス
- 自動的に生成された、または CREATE STATISTICS ステートメントによって生成された分布統計情報
- CHECK 制約
- FOREIGN KEY 制約
tempdb を操作する場合、COLLATE 句に database_default オプションを指定することで、一時テーブルの列で、接続の現在のユーザー データベースでの既定の照合順序を tempdb の代わりに使用するように指定することもできます。
照合順序と text 列
データベースの既定の照合順序のコード ページと異なる照合順序が設定された text 列では、値の挿入と更新が可能です。SQL Server により、値がこの列の照合順序に暗黙的に変換されます。
照合順序と tempdb
tempdb データベースは、SQL Server が起動されるたびに作成され、model データベースと同じ既定の照合順序が設定されます。これは、通常、インスタンスの既定の照合順序と同じになります。ユーザー データベースを作成して、model と異なる既定の照合順序を指定すると、そのユーザー データベースでは tempdb と異なる既定の照合順序が使用されます。一時ストアド プロシージャや一時テーブルは、すべて tempdb 内に作成および格納されます。その結果、一時テーブル内のすべての暗黙の列、および一時ストアド プロシージャ内で強制的に適用されるすべての既定の定数、変数、パラメータでは、パーマネント テーブルやストアド プロシージャで作成される同等のオブジェクトとは異なる照合順序が指定されます。
このため、ユーザー定義データベースとシステム データベース オブジェクトの照合順序の不一致による問題が発生する可能性があります。たとえば、SQL Server 2005 のインスタンスでは照合順序として Latin1_General_CS_AS が使用されていて、次のステートメントを実行するとします。
CREATE DATABASE TestDB COLLATE Estonian_CS_AS;
USE TestDB;
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );
このシステムでは、tempdb データベースにコード ページ 1252 の Latin1_General_CS_AS 照合順序が使用され、TestDB
と TestPermTab.Col1
にコード ページ 1257 の Estonian_CS_AS
照合順序が使用されることになります。次に例を示します。
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 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 )
参照
概念
サーバー照合順序の設定と変更
データベース照合順序の設定および変更
式の照合順序の設定
識別子の照合順序