次の方法で共有


列の照合順序を設定または変更する

テーブルの特定の列に対して異なる照合順序を指定し、次のいずれかを使用して、 charvarchartextncharnvarchar、および ntext データのデータベース照合順序をオーバーライドできます。

  • COLLATE 句は CREATE TABLEALTER TABLE に含まれます。 例えば次が挙げられます。

    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;  
    GO  
    
  • SQL Server Management Studio。 詳細については、 照合順序と Unicode のサポートに関するページを参照してください。

  • SQL Server 管理オブジェクト (SMO) で Column.Collation プロパティを使用する。

次のいずれかによって現在参照されている列の照合順序を変更することはできません。

  • 計算列

  • インデックス

  • 自動的に生成されるか、CREATE STATISTICS ステートメントによって生成される分散統計

  • CHECK 制約

  • 外部キー制約

tempdb を使用する場合、COLLATE 句には、一時テーブル内の列が tempdb の照合順序ではなく、接続において現在のユーザー データベースの照合順序の既定値を使用するように指定する database_default オプションが含まれています。

照合順序とテキスト列

照合順序がデータベースの既定の照合順序のコード ページとは異なる text 列に値を挿入または更新できます。 SQL Server は、値を列の照合順序に暗黙的に変換します。

照合順序と tempdb

tempdb データベースは、SQL Server が起動されるたびに構築され、モデル データベースと同じ既定の照合順序を持ちます。 これは通常、インスタンスの既定の照合順序と同じです。 ユーザー データベースを作成し、 モデルとは異なる既定の照合順序を指定した場合、ユーザー データベースの既定の照合順序は 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 データベースはコード ページ 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.Col1Estonian_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  
       );  
    

こちらもご覧ください

サーバーの照合順序を設定または変更する
データベースの照合順序を設定または変更する
照合順序と Unicode のサポート