照合順序の優先順位

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

照合順序の優先順位 (照合順序強制規則とも呼ばれます) は、次の 2 つの結果を決定します。

  • 文字列として評価される式の最終的な結果の照合順序。

  • LIKE、IN など、入力として文字列を使用するが文字列を返さない、照合順序依存の演算子によって使用される照合順序

照合順序の優先順位のルールは、charvarchartextncharnvarcharntext の各文字列データ型に対してのみ適用されます。 他のデータ型のオブジェクトは、照合順序の評価の対象にはなりません。

照合順序ラベル

すべてのオブジェクトの照合順序は 4 つのカテゴリに分類されます。これらのカテゴリの一覧とその説明を以下の表に示します。 各カテゴリの名前を、照合順序ラベルと呼びます。

照合順序ラベル オブジェクトの種類
Coercible-default 任意の Transact-SQL 文字列変数、パラメーター、リテラル、カタログの組み込み関数の出力、または入力に文字列を使用しないが文字列を出力する組み込み関数の出力です。

このオブジェクトが、ユーザー定義関数、ストアド プロシージャ、またはトリガー内で宣言されている場合、そのオブジェクトには、関数、ストアド プロシージャ、またはトリガーが作成されているデータベースの既定の照合順序が割り当てられます。 オブジェクトがバッチ内で宣言されている場合は、その接続に対する現在のデータベースの既定の照合順序が割り当てられます。
Implicit X 列参照です。 式の照合順序 (X) には、テーブルまたはビューの列に対して定義されている照合順序が使用されます。

列が or CREATE VIEW ステートメントの句CREATE TABLEを使用COLLATEして照合順序を明示的に割り当てられた場合でも、列参照は暗黙的に分類されます。
Explicit X 式の中で、COLLATE 句を使用して特定の照合順序 (X) に明示的にキャストされる式です。
No-collation 式の値が、2 つの文字列の照合順序ラベルが "暗黙" で、それぞれの照合順序が競合する場合のその文字列間の操作の結果であることを示します。 式の結果は、照合順序なしとして定義されます。

照合順序の規則

文字列オブジェクトを 1 つだけ参照する単純な式の場合、その式の照合順序ラベルには、参照先のオブジェクトの照合順序ラベルが使用されます。

同じ照合順序ラベルを持つ 2 つのオペランド式を参照する複雑な式の場合、その式の照合順序ラベルには、オペランド式の照合順序ラベルが使用されます。

異なる照合順序を持つ 2 つのオペランド式を参照する複雑な式の場合、最終的な結果の照合順序ラベルは、次のルールに基づいて決定されます。

  • 明示的な照合順序は、暗黙的な照合順序よりも優先されます。 暗黙的な照合順序は、強制可能な既定照合順序よりも優先されます。

    明示的 > 暗黙的 > 強制可能な既定照合順序

  • 異なる照合順序が割り当てられている 2 つの明示的な式を組み合わせると、エラーが発生します。

    明示的な照合順序 X + 明示的な照合順序 Y = エラー

  • 異なる照合順序を持つ 2 つの暗黙的な式を組み合わせると、照合順序なしになります。

    暗黙的な照合順序 X + 暗黙的な照合順序 Y = 照合順序なし

  • 照合順序なしの式と任意のラベルの式を組み合わせると、照合順序なしのラベルが生成されます。ただし、明示的な照合順序の場合は例外です。それについては次のルールを参照してください。

    照合順序なし + 任意 = 照合順序なし

  • 照合順序なしの式を、明示的な照合順序を持つ式と組み合わせると、明示的な照合順序のラベルを持つ式になります。

    照合順序なし + 明示的な照合順序 X = 明示的な照合順序

次の表は、ルールのまとめです。

オペランド強制ラベル 明示的な照合順序 X 暗黙的な照合順序 X 強制可能な既定照合順序 照合順序なし
Explicit Y エラーが生成されます。 結果は、明示的な照合順序 Y です。 結果は、明示的な照合順序 Y です。 結果は、明示的な照合順序 Y です。
Implicit Y 結果は明示的な照合順序 X です。 結果は、照合順序なしです。 結果は、暗黙的な照合順序 Y です。 結果は、照合順序なしです。
Coercible-default 結果は明示的な照合順序 X です。 結果は暗黙的な照合順序 X です。 結果は、強制可能な既定照合順序です。 結果は、照合順序なしです。
No-collation 結果は明示的な照合順序 X です。 結果は、照合順序なしです。 結果は、照合順序なしです。 結果は、照合順序なしです。

また、次の追加のルールも照合順序の優先順位に適用されます。

  • 式で明示的に照合順序が指定されている場合、その式にさらに COLLATE 句を指定することはできません。 たとえば、次の WHERE 句は、既に明示的に照合順序が指定されている式に対して COLLATE 句が指定されているため、不正な式となります。

    WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS

  • text 型で使用されるコード ページは変換できません。 text 式の照合順序をキャストする場合、キャスト前とキャスト後の照合順序のコード ページが異なると、キャストできません。 代入演算子を使用する場合、右側のテキスト オペランドの照合順序のコードページが左側のテキスト オペランドのコード ページと異なると、代入演算子は値を割り当てることができません。

照合順序の優先順位の決定は、データ型変換の後に行われます。 結果の照合順序を提供するオペランドは、最終結果のデータ型を提供するオペランドと異なっていてもかまいません。 たとえば、次のバッチがあるとします。

CREATE TABLE TestTab  
   (PrimaryKey int PRIMARY KEY,  
    CharCol char(10) COLLATE French_CI_AS  
   )  
  
SELECT *  
FROM TestTab  
WHERE CharCol LIKE N'abc'  

Note

nvarchar データ型は Fabric Warehouse ではサポートされていませんが、この記事のほとんどの例は、UTF-8 と nvarchar を使用した varchar の両方に適用されるため、特に明記されていない限りメイン Fabric Warehouse に適用できます。

N'abc' という単純な式の Unicode データ型は、データ型の優先順位が高いため、 その結果式には N'abc' に割り当てられている Unicode データ型が使用されます。 これに対し、式 CharCol は暗黙的な照合順序のラベルを持ち、N'abc' はそれよりも優先順位の低い強制可能な既定照合順序のラベルを持つため、 照合順序には、CharCol の照合順序 French_CI_AS が使用されます。

照合順序規則の例

照合順序ルールについて、以下の例で説明します。 この例を実行するには、次に示すテスト テーブルを作成します。

USE tempdb;  
GO  
  
CREATE TABLE TestTab (  
   id int,   
   GreekCol nvarchar(10) collate greek_ci_as,   
   LatinCol nvarchar(10) collate latin1_general_cs_as  
   )  
INSERT TestTab VALUES (1, N'A', N'a');  
GO  

照合順序の競合とエラー

次のクエリの述語に照合順序の競合が発生し、エラーが生成されます。

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol;  

結果セットは次のようになります。

Msg 448, Level 16, State 9, Line 2  
Cannot resolve collation conflict between 'Latin1_General_CS_AS' and 'Greek_CI_AS' in equal to operation.  

明示的なラベルと暗黙的なラベル

次のクエリの述語は、右側の式が明示ラベルを持っているので、照合順序 greek_ci_as で評価されます。 右側の式の明示ラベルは、左側の式の暗黙ラベルよりも優先されます。

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol COLLATE greek_ci_as;  

結果セットは次のようになります。

id          GreekCol             LatinCol  
----------- -------------------- --------------------  
          1 A                    a  
  
(1 row affected)  

照合順序ラベルなし

Note

UTF-8 照合順序での nvarchar と varchar動作の違いのため、この例は Fabric Warehouse では適用されません。

次のクエリの CASE 式の照合順序ラベルは、照合順序なしです。したがって、この式を選択リストに指定したり、照合順序依存の演算子によって処理することはできません。 ただし、この式を、照合順序非依存の演算子を使用して処理することはできます。

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)   
FROM TestTab;  

結果セットは次のようになります。

Msg 451, Level 16, State 1, Line 1  
Cannot resolve collation conflict for column 1 in SELECT statement.  
SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')  
FROM TestTab;  

結果セットは次のようになります。

Msg 446, Level 16, State 9, Server LEIH2, Line 1  
Cannot resolve collation conflict for patindex operation.  
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS   
FROM TestTab;  

結果セットは次のようになります。

--------------------  
a  
  
(1 row affected)  

照合順序の機密性が高く、照合順序が区別されない

演算子と関数は、照合順序依存または非依存のいずれかです。

  • 照合順序の機密性: これは、照合順序なしオペランドを指定するとコンパイル時エラーであることを意味します。 その式の結果を、照合順序なしに指定することはできません。
  • 照合順序を区別しない: これは、オペランドと結果を照合順序なしにできることを意味します。

演算子と照合順序

比較演算子、および MAXMIN、、BETWEENLIKE演算子INは照合順序に依存します。 これらの演算子で使用される文字列には、優先順位の高い方のオペランドの照合順序ラベルが割り当てられます。 この UNION ステートメントは照合順序も区別され、すべての文字列オペランドと最終的な結果には、最も優先順位の高いオペランドの照合順序が割り当てられます。 オペランドと結果の照合順序の UNION 優先順位は、列ごとに評価されます。

代入演算子は照合順序非依存で、右側の式が左側の照合順序にキャストされます。

文字列連結演算子は照合順序依存で、2 つの文字列オペランドとその結果には、最高の優先順位を持つオペランドの照合順序ラベルが割り当てられます。 UNION ALL and CASE ステートメントは照合順序を区別せず、すべての文字列オペランドと最終的な結果には、最も優先順位の高いオペランドの照合順序ラベルが割り当てられます。 オペランドと結果の照合順序の UNION ALL 優先順位は、列ごとに評価されます。

関数と照合順序

THECASTCONVERT、およびCOLLATE関数は、char、varcharおよびテキストデータ型の照合順序に依存します。 および関数の CAST 入力と CONVERT 出力が文字列の場合、出力文字列には入力文字列の照合順序ラベルが付けられます。 入力が文字列でない場合、出力文字列は Coercible-default で、接続の現在のデータベースの照合順序、または参照先または参照先のユーザー定義関数、ストアド プロシージャ、またはトリガーをCASTCONVERT含むデータベースの照合順序が割り当てられます。

文字列を返すが、文字列入力を受け取らない組み込み関数の場合、結果の文字列は Coercible-default です。 結果文字列には、現在のデータベースの照合順序、または関数が参照されるユーザー定義関数、ストアド プロシージャ、またはトリガーを含むデータベースの照合順序が割り当てられます。

次の関数は、照合順序依存です。その出力文字列は、入力文字列の照合順序ラベルを持ちます。

CHARINDEX

REPLACE

DIFFERENCE

REVERSE

ISNUMERIC

RIGHT

LEFT

SOUNDEX

LEN

STUFF

LOWER

SUBSTRING

PATINDEX

UPPER