Rangfolge von Sortierungen (Transact-SQL)Collation Precedence (Transact-SQL)

DIESES THEMA GILT FÜR: jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Mit der Rangfolge von Sortierungen, die auch als Sortierungsprioritätsregeln bezeichnet werden, wird Folgendes festgelegt:Collation precedence, also known as collation coercion rules, determines the following:

  • Die Sortierung des endgültigen Ergebnisses eines Ausdrucks, der zu einer Zeichenfolge ausgewertet wird.The collation of the final result of an expression that is evaluated to a character string.

  • Die Sortierung, die von sortierungsabhängigen Operatoren verwendet wird, die Zeichenfolgen als Eingabe verwenden, jedoch keine Zeichenfolge zurückgeben, z. B. LIKE und IN.The collation that is used by collation-sensitive operators that use character string inputs but do not return a character string, such as LIKE and IN.

    Die sortierungsprioritätsregeln gelten nur für die Zeichenfolgen-Datentypen: Char, Varchar, Text, Nchar, Nvarchar, und Ntext.The collation precedence rules apply only to the character string data types: char, varchar, text, nchar, nvarchar, and ntext. Objekte mit anderen Datentypen werden in Sortierungsbewertungen nicht einbezogen.Objects that have other data types do not participate in collation evaluations.

SortierungsbezeichnungenCollation Labels

In der folgenden Tabelle werden die vier Kategorien mit den jeweiligen Sortierungen aller Objekte aufgelistet und beschrieben.The following table lists and describes the four categories in which the collations of all objects are identified. Der Name jeder Kategorie wird Sortierungsbezeichnung genannt.The name of each category is called the collation label.

SortierungsbezeichnungCollation label Typen von ObjektenTypes of objects
Coercible-defaultCoercible-default Alle Transact-SQLTransact-SQL-Zeichenfolgenvariablen, Parameter, Literale oder die Ausgabe einer in einen Katalog integrierten Funktion oder einer integrierten Funktion, die keine Zeichenfolgeneingabe akzeptiert, jedoch eine Zeichenfolge ausgibt.Any Transact-SQLTransact-SQL character string variable, parameter, literal, or the output of a catalog built-in function, or a built-in function that does not take string inputs but produces a string output.

Wenn das Objekt in einer benutzerdefinierten Funktion, einer gespeicherten Prozedur oder einem Trigger deklariert ist, wird dem Objekt die Standardsortierung der Datenbank zugewiesen, in der die Funktion, die gespeicherte Prozedur oder der Trigger erstellt wurde.If the object is declared in a user-defined function, stored procedure, or trigger, the object is assigned the default collation of the database in which the function, stored procedure, or trigger is created. Wenn das Objekt in einem Batch deklariert ist, wird dem Objekt die Standardsortierung der aktuellen Datenbank für die Verbindung zugewiesen.If the object is declared in a batch, the object is assigned the default collation of the current database for the connection.
Implicit XImplicit X Ein Spaltenverweis.A column reference. Die Sortierung für den Ausdruck (X) wird von der Sortierung übernommen, die für die Spalte der Tabelle oder Sicht definiert ist.The collation of the expression (X) is taken from the collation defined for the column in the table or view.

Selbst wenn der Spalte explizit durch eine COLLATE-Klausel in der CREATE TABLE- oder CREATE VIEW-Anweisung eine Sortierung zugewiesen wurde, wird der Spaltenverweis als Implicit klassifiziert.Even if the column was explicitly assigned a collation by using a COLLATE clause in the CREATE TABLE or CREATE VIEW statement, the column reference is classified as implicit.
Explicit XExplicit X Ein Ausdruck, der durch die Verwendung einer COLLATE-Klausel im Ausdruck explizit in eine bestimmte Sortierung (X) umgewandelt wird.An expression that is explicitly cast to a specific collation (X) by using a COLLATE clause in the expression.
No-collationNo-collation Zeigt an, dass der Wert eines Ausdrucks das Ergebnis eines Vorgangs zwischen zwei Zeichenfolgen ist, die konfliktverursachende Sortierungen mit der Sortierungsbezeichnung Implicit haben.Indicates that the value of an expression is the result of an operation between two strings that have conflicting collations of the implicit collation label. Das Ergebnis des Ausdrucks hat definitionsgemäß keine Sortierung.The expression result is defined as not having a collation.

SortierungsregelnCollation Rules

Die Sortierungsbezeichnung eines einfachen Ausdrucks, der nur auf ein Zeichenfolgenobjekt verweist, ist die Sortierungsbezeichnung des Objekts, auf das verwiesen wird.The collation label of a simple expression that references only one character string object is the collation label of the referenced object.

Die Sortierungsbezeichnung eines komplexen Ausdrucks, der auf zwei Operandenausdrücke mit derselben Sortierungsbezeichnung verweist, ist die Sortierungsbezeichnung der Operandenausdrücke.The collation label of a complex expression that references two operand expressions with the same collation label is the collation label of the operand expressions.

Für die Sortierungsbezeichnung des Endergebnisses eines komplexen Ausdrucks, der auf zwei Operandenausdrücke mit verschiedenen Sortierungen verweist, gelten die folgenden Regeln:The collation label of the final result of a complex expression that references two operand expressions with different collations is based on the following rules:

  • Explicit hat Vorrang vor Implicit.Explicit takes precedence over implicit. Implicit hat Vorrang vor Coercible-default:Implicit takes precedence over Coercible-default:

    Explicit > Implicit > Coercible-defaultExplicit > Implicit > Coercible-default

  • Durch Kombinieren von zwei Explicit-Ausdrücken, denen unterschiedliche Sortierungen zugewiesen wurden, wird ein Fehler erzeugt.Combining two Explicit expressions that have been assigned different collations generates an error:

    Explicit X + Explicit Y = FehlerExplicit X + Explicit Y = Error

  • Das Kombinieren von zwei Implicit-Ausdrücken mit unterschiedlichen Sortierungen ergibt ein Ergebnis ohne Sortierung (No-collation):Combining two Implicit expressions that have different collations yields a result of No-collation:

    Implicit X + Implicit Y = No-collationImplicit X + Implicit Y = No-collation

  • Das Kombinieren eines Ausdrucks ohne Sortierung (No-collation) mit einem Ausdruck mit einer beliebigen Bezeichnung, lediglich ausgenommen einer expliziten Sortierung (Explicit) (siehe folgender Punkt), ergibt ein Ergebnis mit der Bezeichnung No-collation:Combining an expression with No-collation with an expression of any label, except Explicit collation (see the following rule), yields a result that has the No-collation label:

    No-collation + beliebige Sortierung = No-collationNo-collation + anything = No-collation

  • Das Kombinieren eines Ausdrucks ohne Sortierung (No-collation) mit einem Ausdruck, der die Sortierung Explicit aufweist, ergibt einen Ausdruck mit der Bezeichnung Explicit.Combining an expression with No-collation with an expression that has an Explicit collation, yields an expression with an Explicit label:

    No-collation + Explicit X = ExplicitNo-collation + Explicit X = Explicit

    In der folgenden Tabelle werden die Regeln zusammengefasst.The following table summarizes the rules.

Prioritätsbezeichnung des OperandenOperand coercion label Explicit XExplicit X Implicit XImplicit X Coercible-defaultCoercible-default No-collationNo-collation
EXPLICIT YExplicit Y Ein Fehler wird erzeugtGenerates Error Ergebnis ist Explicit YResult is Explicit Y Ergebnis ist Explicit YResult is Explicit Y Ergebnis ist Explicit YResult is Explicit Y
Implicit YImplicit Y Ergebnis ist Explicit XResult is Explicit X Ergebnis ist No-collationResult is No-collation Ergebnis ist Implicit YResult is Implicit Y Ergebnis ist No-collationResult is No-collation
Coercible-StandardCoercible-default Ergebnis ist Explicit XResult is Explicit X Ergebnis ist Implicit XResult is Implicit X Ergebnis ist Coercible-defaultResult is Coercible-default Ergebnis ist No-collationResult is No-collation
No-collationNo-collation Ergebnis ist Explicit XResult is Explicit X Ergebnis ist No-collationResult is No-collation Ergebnis ist No-collationResult is No-collation Ergebnis ist No-collationResult is No-collation

Die folgenden zusätzlichen Regeln sind auch auf die Sortierungspriorität anwendbar:The following additional rules also apply to collation precedence:

  • Sie können nicht mehrere COLLATE-Klauseln für einen Ausdruck festlegen, der bereits ein expliziter Ausdruck ist.You cannot have multiple COLLATE clauses on an expression that is already an explicit expression. Die folgende WHERE-Klausel ist beispielsweise ungültig, da für einen Ausdruck, der bereits ein expliziter Ausdruck ist, eine COLLATE-Klausel angegeben wurde:For example, the following WHERE clause is not valid because a COLLATE clause is specified for an expression that is already an explicit expression:

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

  • Codepagekonvertierungen für Text Datentypen sind nicht zulässig.Code page conversions for text data types are not allowed. Sie können nicht umgewandelt eine Text Ausdruck von einer Sortierung in eine andere besäßen sie unterschiedliche Codepages.You cannot cast a text expression from one collation to another if they have the different code pages. Der Zuweisungsoperator kann keine Werte zuweisen, wenn die Sortierung des rechten Textoperanden eine andere Codepage als die des linken Textoperanden besitzt.The assignment operator cannot assign values when the collation of the right text operand has a different code page than the left text operand.

    Die Rangfolge von Sortierungen wird nach der Konvertierung der Datentypen bestimmt.Collation precedence is determined after data type conversion. Der Operand, von dem die resultierende Sortierung genommen wird, kann sich von dem Operanden unterscheiden, der den Datentyp für das Endergebnis bereitstellt.The operand from which the resulting collation is taken can be different from the operand that supplies the data type of the final result. Betrachten Sie beispielsweise den folgenden Batch aus:For example, consider the following batch:

CREATE TABLE TestTab  
   (PrimaryKey int PRIMARY KEY,  
    CharCol char(10) COLLATE French_CI_AS  
   )  

SELECT *  
FROM TestTab  
WHERE CharCol LIKE N'abc'  

Der Unicode-Datentyp des einfachen Ausdrucks N'abc' besitzt eine höhere Datentyp-Rangfolge.The Unicode data type of the simple expression N'abc' has a higher data type precedence. Daher wird im sich ergebenden Ausdruck der Unicode-Datentyp N'abc' zugewiesen.Therefore, the resulting expression has the Unicode data type assigned to N'abc'. Der Ausdruck CharCol hat jedoch die Sortierungsbezeichnung Implicit, während N'abc' die in der Priorität niedrigere Bezeichnung Coercible-default aufweist.However, the expression CharCol has a collation label of Implicit, and N'abc' has a lower coercion label of Coercible-default. Deshalb wird als Sortierung die French_CI_AS-Sortierung von CharCol verwendet.Therefore, the collation that is used is the French_CI_AS collation of CharCol.

Beispiele für SortierungsregelnExamples of Collation Rules

Die folgenden Beispiele veranschaulichen die Funktionsweise der Sortierungsregeln.The following examples show how the collation rules work. Erstellen Sie die folgende Testtabelle, um die Beispiele zu testen.To run the examples, create the following test table.

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  

Sortierungskonflikt und FehlerCollation Conflict and Error

Das Prädikat in der folgenden Abfrage weist einen Sortierungskonflikt auf und generiert einen Fehler:The predicate in the following query has collation conflict and generates an error.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol;  

Im Folgenden finden Sie das Resultset.Here is the result set.

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.  

Bezeichnung "Explicit" und Bezeichnung "Implicit"Explicit Label vs. Implicit Label

Das Prädikat in der folgenden Abfrage wird zu greek_ci_as ausgewertet, da der rechte Ausdruck die Bezeichnung Explicit aufweist.The predicate in the following query is evaluated in collation greek_ci_as because the right expression has the Explicit label. Diese hat Vorrang vor der Bezeichnung Implicit des linken Ausdrucks.This takes precedence over the Implicit label of the left expression.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol COLLATE greek_ci_as;  

Im Folgenden finden Sie das Resultset.Here is the result set.

id          GreekCol             LatinCol  
----------- -------------------- --------------------  
          1 A                    a  

(1 row affected)  

Bezeichnung No-CollationNo-Collation Labels

Die CASE-Ausdrücke in den folgenden Abfragen weisen die Sortierungsbezeichnung No-collation auf; sie können deshalb nicht in der Auswahlliste angezeigt werden oder von sortierungsabhängigen Operatoren verwendet werden.The CASE expressions in the following queries have a No-collation label; therefore, they cannot appear in the select list or be operated on by collation-sensitive operators. Die Ausdrücke können jedoch von sortierungsunabhängigen Operatoren verwendet werden.However, the expressions can be operated on by collation-insensitive operators.

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

Im Folgenden finden Sie das Resultset.Here is the result set.

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;  

Im Folgenden finden Sie das Resultset.Here is the result set.

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;  

Im Folgenden finden Sie das Resultset.Here is the result set.

--------------------  
a  

(1 row affected)  

Sortierungsabhängig und sortierungsunabhängigCollation Sensitive and Collation Insensitive

Operatoren und Funktionen sind sortierungsabhängig oder -unabhängig.Operators and functions are either collation sensitive or insensitive.

SortierungsabhängigCollation sensitive
Sortierungsabhängig bedeutet, dass das Angeben eines No-collation-Operanden zu einem Fehler während der Kompilierung führt.This means that specifying a No-collation operand is a compile-time error. Das Ergebnis des Ausdrucks kann nicht No-collation lauten.The expression result cannot be No-collation.

SortierungsunabhängigCollation insensitive
Sortierungsunabhängig bedeutet, dass die Operanden und das Ergebnis die Bezeichnung No-collation haben können.This means that the operands and result can be No-collation.

Operatoren und SortierungOperators and Collation

Die Vergleichsoperatoren und die Operatoren MAX, MIN, BETWEEN, LIKE und IN sind sortierungsabhängig.The comparison operators, and the MAX, MIN, BETWEEN, LIKE, and IN operators, are collation sensitive. Der Zeichenfolge, die von den Operatoren verwendet wird, wird die Sortierungsbezeichnung des Operanden zugewiesen, der den höheren Rang hat.The string used by the operators is assigned the collation label of the operand that has the higher precedence. Der UNION-Operator ist ebenfalls sortierungsabhängig, und allen Zeichenfolgenoperanden und dem Endergebnis wird die Sortierung des Operanden mit dem höchsten Rang zugewiesen.The UNION operator is also collation sensitive, and all string operands and the final result is assigned the collation of the operand with the highest precedence. Die Sortierungsrangfolge der UNION-Operanden und des Ergebnisses werden spaltenweise ausgewertet.The collation precedence of the UNION operands and result are evaluated column by column.

Der Zuweisungsoperator ist sortierungsabhängig, und der rechte Ausdruck wird in die linke Sortierung umgewandelt.The assignment operator is collation insensitive and the right expression is cast to the left collation.

Der Operator für die Zeichenfolgenverkettung ist sortierungsabhängig, und den beiden Zeichenfolgenoperanden und dem Ergebnis wird die Sortierungsbezeichnung des Operanden mit dem höchsten Sortierungsrang zugewiesen.The string concatenation operator is collation sensitive, the two string operands and the result are assigned the collation label of the operand with the highest collation precedence. Der UNION ALL- und der CASE-Operator sind ebenfalls sortierungsunabhängig, und allen Zeichenfolgenoperanden und den Endergebnissen wird die Sortierungsbezeichnung des Operanden mit dem höchsten Rang zugewiesen.The UNION ALL and CASE operators are collation insensitive, and all string operands and the final results are assigned the collation label of the operand with the highest precedence. Die Sortierungsrangfolge der UNION ALL-Operanden und des Ergebnisses werden spaltenweise ausgewertet.The collation precedence of the UNION ALL operands and result are evaluated column by column.

Funktionen und SortierungFunctions and Collation

DIE Funktionen CAST, CONVERT und COLLATE sind sortierungsabhängig für Char, Varchar, und Text -Datentypen.THE CAST, CONVERT, and COLLATE functions are collation sensitive for char, varchar, and text data types. Wenn die Eingabe und die Ausgabe der Funktionen CAST und CONVERT Zeichenfolgen sind, hat die ausgegebene Zeichenfolge die Sortierungsbezeichnung der eingegebenen Zeichenfolge.If the input and output of the CAST and CONVERT functions are character strings, the output string has the collation label of the input string. Wenn die Eingabe keine Zeichenfolge ist, erhält die ausgegebene Zeichenfolge die Bezeichnung Coercible-default. Der Zeichenfolge wird die Sortierung der aktuellen Datenbank für die Verbindung oder die Sortierung der Datenbank zugewiesen, die die benutzerdefinierte Funktion, die gespeicherte Prozedur oder den Trigger enthält, in der bzw. dem auf die CAST- oder CONVERT-Funktion verwiesen wird.If the input is not a character string, the output string is Coercible-default and assigned the collation of the current database for the connection, or the database that contains the user-defined function, stored procedure, or trigger in which the CAST or CONVERT is referenced.

Für integrierte Funktionen, die eine Zeichenfolge zurückgeben, jedoch keine Zeichenfolge als Eingabe verwenden, ist die Bezeichnung für die ausgegebene Zeichenfolge Coercible-default. Der Zeichenfolge wird die Sortierung der aktuellen Datenbank oder der Datenbank zugewiesen, die die benutzerdefinierte Funktion, die gespeicherte Prozedur oder den Trigger enthält, in der bzw. dem auf die Funktion verwiesen wird.For the built-in functions that return a string but do not take a string input, the result string is Coercible-default and is assigned either the collation of the current database, or the collation of the database that contains the user-defined function, stored procedure, or trigger in which the function is referenced.

Die folgenden Funktionen sind sortierungsabhängig, und die entsprechenden ausgegebenen Zeichenfolgen weisen die Sortierungsbezeichnung der eingegebenen Zeichenfolge auf:The following functions are collation-sensitive and their output strings have the collation label of the input string:

CHARINDEXCHARINDEX REPLACEREPLACE
DIFFERENCEDIFFERENCE REVERSEREVERSE
ISNUMERICISNUMERIC RIGHTRIGHT
LEFTLEFT SOUNDEXSOUNDEX
LENLEN STUFFSTUFF
LOWERLOWER SUBSTRINGSUBSTRING
PATINDEXPATINDEX GROSSBUCHSTABENUPPER

Siehe auchSee Also

COLLATE (Transact-SQL) COLLATE (Transact-SQL)
Datentypkonvertierung ( Datenbankmodul ) Data Type Conversion (Database Engine)
Operatoren ( Transact-SQL ) Operators (Transact-SQL)
Ausdrücke (Transact-SQL)Expressions (Transact-SQL)