Rangfolge von Sortierungen (Transact-SQL)
Mit der Rangfolge von Sortierungen, die auch als Sortierungsprioritätsregeln bezeichnet werden, wird Folgendes festgelegt:
Die Sortierung des endgültigen Ergebnisses eines Ausdrucks, der zu einer Zeichenfolge ausgewertet wird.
Die Sortierung, die von sortierungsabhängigen Operatoren verwendet wird, die Zeichenfolgen als Eingabe verwenden, jedoch keine Zeichenfolge zurückgeben, z. B. LIKE und IN.
Die Sortierungsprioritätsregeln gelten nur für die Zeichenfolgen-Datentypen char, varchar, text, nchar, nvarchar und ntext. Objekte mit anderen Datentypen werden in Sortierungsbewertungen nicht einbezogen.
Sortierungsbezeichnungen
In der folgenden Tabelle werden die vier Kategorien mit den jeweiligen Sortierungen aller Objekte aufgelistet und beschrieben. Der Name jeder Kategorie wird Sortierungsbezeichnung genannt.
Sortierungsbezeichnung |
Objekttypen |
---|---|
Coercible-default |
Alle Transact-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. 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. Wenn das Objekt in einem Batch deklariert ist, wird dem Objekt die Standardsortierung der aktuellen Datenbank für die Verbindung zugewiesen. |
Implicit X |
Ein Spaltenverweis. Die Sortierung für den Ausdruck (X) wird von der Sortierung übernommen, die für die Spalte der Tabelle oder Sicht definiert ist. 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. |
Explicit X |
Ein Ausdruck, der durch die Verwendung einer COLLATE-Klausel im Ausdruck explizit in eine bestimmte Sortierung (X) umgewandelt wird. |
No-collation |
Zeigt an, dass der Wert eines Ausdrucks das Ergebnis eines Vorgangs zwischen zwei Zeichenfolgen ist, die konfliktverursachende Sortierungen mit der Sortierungsbezeichnung Implicit haben. Das Ergebnis des Ausdrucks hat definitionsgemäß keine Sortierung. |
Sortierungsregeln
Die Sortierungsbezeichnung eines einfachen Ausdrucks, der nur auf ein Zeichenfolgenobjekt verweist, ist die Sortierungsbezeichnung des Objekts, auf das verwiesen wird.
Die Sortierungsbezeichnung eines komplexen Ausdrucks, der auf zwei Operandenausdrücke mit derselben Sortierungsbezeichnung verweist, ist die Sortierungsbezeichnung der Operandenausdrücke.
Für die Sortierungsbezeichnung des Endergebnisses eines komplexen Ausdrucks, der auf zwei Operandenausdrücke mit verschiedenen Sortierungen verweist, gelten die folgenden Regeln:
Explicit hat Vorrang vor Implicit. Implicit hat Vorrang vor Coercible-default:
Explicit > Implicit > Coercible-default
Durch Kombinieren von zwei Explicit-Ausdrücken, denen unterschiedliche Sortierungen zugewiesen wurden, wird ein Fehler erzeugt.
Explicit X + Explicit Y = Fehler
Das Kombinieren von zwei Implicit-Ausdrücken mit unterschiedlichen Sortierungen ergibt ein Ergebnis ohne Sortierung (No-collation):
Implicit 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:
No-collation + beliebige Sortierung = 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.
No-collation + Explicit X = Explicit
In der folgenden Tabelle werden die Regeln zusammengefasst.
Prioritätsbezeichnung des Operanden |
Explicit X |
Implicit X |
Coercible-default |
No-collation |
---|---|---|---|---|
Explicit Y |
Ein Fehler wird erzeugt |
Ergebnis ist Explicit Y |
Ergebnis ist Explicit Y |
Ergebnis ist Explicit Y |
Implicit Y |
Ergebnis ist Explicit X |
Ergebnis ist No-collation |
Ergebnis ist Implicit Y |
Ergebnis ist No-collation |
Coercible-default |
Ergebnis ist Explicit X |
Ergebnis ist Implicit X |
Ergebnis ist Coercible-default |
Ergebnis ist No-collation |
No-collation |
Ergebnis ist Explicit X |
Ergebnis ist No-collation |
Ergebnis ist No-collation |
Ergebnis ist No-collation |
Die folgenden zusätzlichen Regeln sind auch auf die Sortierungspriorität anwendbar:
Sie können nicht mehrere COLLATE-Klauseln für einen Ausdruck festlegen, der bereits ein expliziter Ausdruck ist. Die folgende WHERE-Klausel ist beispielsweise ungültig, da für einen Ausdruck, der bereits ein expliziter Ausdruck ist, eine COLLATE-Klausel angegeben wurde:
WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS
Codepagekonvertierungen für text-Datentypen sind nicht zulässig. Sie können einen text-Ausdruck nur dann von einer Sortierung in eine andere umwandeln, wenn sie dieselbe Codepage haben. Der Zuweisungsoperator kann keine Werte zuweisen, wenn die Sortierung des rechten Textoperanden eine andere Codepage als die des linken Textoperanden besitzt.
Die Rangfolge von Sortierungen wird nach der Konvertierung der Datentypen bestimmt. Der Operand, von dem die resultierende Sortierung genommen wird, kann sich von dem Operanden unterscheiden, der den Datentyp für das Endergebnis bereitstellt. Beispiel:
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. Daher wird im sich ergebenden Ausdruck der Unicode-Datentyp N'abc' zugewiesen. Der Ausdruck CharCol hat jedoch die Sortierungsbezeichnung Implicit, während N'abc' die in der Priorität niedrigere Bezeichnung Coercible-default aufweist. Deshalb wird als Sortierung die French_CI_AS-Sortierung von CharCol verwendet.
Beispiele für Sortierungsregeln
Die folgenden Beispiele veranschaulichen die Funktionsweise der Sortierungsregeln. Erstellen Sie die folgende Testtabelle, um die Beispiele zu testen.
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 Fehler
Das Prädikat in der folgenden Abfrage weist einen Sortierungskonflikt auf und generiert einen Fehler:
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;
Dies ist das Resultset.
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.
Bezeichnungen Explicit und Implicit
Das Prädikat in der folgenden Abfrage wird zu greek_ci_as ausgewertet, da der rechte Ausdruck die Bezeichnung Explicit aufweist. Diese hat Vorrang vor der Bezeichnung Implicit des linken Ausdrucks.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;
Dies ist das Resultset.
id GreekCol LatinCol
----------- -------------------- --------------------
1 A a
(1 row affected)
Bezeichnung No-Collation
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. Die Ausdrücke können jedoch von sortierungsunabhängigen Operatoren verwendet werden.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab;
Dies ist das Resultset.
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;
Dies ist das Resultset.
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;
Dies ist das Resultset.
--------------------
a
(1 row affected)
Sortierungsabhängig und sortierungsunabhängig
Operatoren und Funktionen sind sortierungsabhängig oder -unabhängig.
Sortierungsabhängig
Sortierungsabhängig bedeutet, dass das Angeben eines No-collation-Operanden zu einem Fehler während der Kompilierung führt. Das Ergebnis des Ausdrucks kann nicht No-collation lauten.Sortierungsunabhängig
Sortierungsunabhängig bedeutet, dass die Operanden und das Ergebnis die Bezeichnung No-collation haben können.
Operatoren und Sortierung
Die Vergleichsoperatoren und die Operatoren MAX, MIN, BETWEEN, LIKE und IN sind sortierungsabhängig. Der Zeichenfolge, die von den Operatoren verwendet wird, wird die Sortierungsbezeichnung des Operanden zugewiesen, der den höheren Rang hat. Der UNION-Operator ist ebenfalls sortierungsabhängig, und allen Zeichenfolgenoperanden und dem Endergebnis wird die Sortierung des Operanden mit dem höchsten Rang zugewiesen. Die Sortierungsrangfolge der UNION-Operanden und des Ergebnisses werden spaltenweise ausgewertet.
Der Zuweisungsoperator ist sortierungsabhängig, und der rechte Ausdruck wird in die linke Sortierung umgewandelt.
Der Operator für die Zeichenfolgenverkettung ist ebenfalls sortierungsunabhängig, und den beiden Zeichenfolgenoperanden und dem Ergebnis wird die Sortierungsbezeichnung des Operanden mit dem höchsten Sortierungsrang zugewiesen. 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. Die Sortierungsrangfolge der UNION ALL-Operanden und des Ergebnisses werden spaltenweise ausgewertet.
Funktionen und Sortierung
Die Funktionen CAST, CONVERT und COLLATE sind sortierungsabhängig für die Datentypen char, varchar und text. Wenn die Eingabe und die Ausgabe der Funktionen CAST und CONVERT Zeichenfolgen sind, hat die ausgegebene Zeichenfolge die Sortierungsbezeichnung der eingegebenen Zeichenfolge. 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.
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.
Die folgenden Funktionen sind sortierungsabhängig, und die entsprechenden ausgegebenen Zeichenfolgen weisen die Sortierungsbezeichnung der eingegebenen Zeichenfolge auf:
CHARINDEX |
REPLACE |
DIFFERENCE |
REVERSE |
ISNUMERIC |
RIGHT |
LEFT |
SOUNDEX |
LEN |
STUFF |
LOWER |
SUBSTRING |
PATINDEX |
UPPER |
Siehe auch