Rangfolge von Sortierungen
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
Die Rangfolge der Sortierung, auch als Sortierungskoersionsregeln bezeichnet, bestimmt die folgenden beiden Ergebnisse:
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 Regeln für die Rangfolge von Sortierungen gelten nur für die Zeichenfolgen-Datentypen char, varchar, text, nchar, nvarchar und ntext. Objekte mit anderen Datentypen werden in Sortierungsbewertungen nicht einbezogen.
Sortierbeschriftungen
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. Auch wenn der Spalte explizit eine Sortierung mithilfe einer COLLATE Klausel in der CREATE TABLE oder CREATE VIEW Anweisung zugewiesen wurde, wird der Spaltenverweis als implizit 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. |
Sortierregeln
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:
Explizite > Implizite > erzwingbare Standardeinstellung
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, eineCOLLATE
-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. Angenommen, der folgende Batch liegt vor:
CREATE TABLE TestTab
(PrimaryKey int PRIMARY KEY,
CharCol char(10) COLLATE French_CI_AS
)
SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc'
Hinweis
Der Datentyp "nvarchar " wird in Fabric Warehouse nicht unterstützt, aber die meisten Beispiele in diesem Artikel gelten sowohl für Varchar unter Verwendung von UTF-8 als auch für nvarchar und bleiben daher für Fabric Warehouse anwendbar, sofern nicht anders angegeben.
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 Sortierregeln
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;
Hier sehen Sie das Ergebnis.
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.
Explizite Bezeichnung im Vergleich zur impliziten Bezeichnung
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;
Hier sehen Sie das Ergebnis.
id GreekCol LatinCol
----------- -------------------- --------------------
1 A a
(1 row affected)
Keine Sortierbeschriftungen
Hinweis
Aufgrund des Unterschieds zwischen dem Verhalten von nvarchar und varchar in einer UTF-8-Sortierung gilt dieses Beispiel nicht für Fabric Warehouse.
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;
Hier sehen Sie das Ergebnis.
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;
Hier sehen Sie das Ergebnis.
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;
Hier sehen Sie das Ergebnis.
--------------------
a
(1 row affected)
Sortierung vertraulich und sortierungsunempfindlich
Operatoren und Funktionen sind sortierungsabhängig oder -unabhängig.
- Sortierungssensitiv: Dies bedeutet, dass das Angeben eines No-Collation-Operanden ein Kompilierungszeitfehler ist. Das Ergebnis des Ausdrucks kann nicht No-collation lauten.
- Sortierung nicht beachtet: Dies bedeutet, dass die Operanden und das Ergebnis keine Sortierung sein können.
Operatoren und Sortierung
Die Vergleichsoperatoren und die MAX
Operatoren , MIN
, BETWEEN
, LIKE
und IN
Operatoren sind sortierungsempfindlich. Der Zeichenfolge, die von den Operatoren verwendet wird, wird die Sortierungsbezeichnung des Operanden zugewiesen, der den höheren Rang hat. Die UNION
Anweisung ist auch sortierungsempfindlich, und alle Zeichenfolgenopernden und das Endergebnis wird die Sortierung des Operanden mit der höchsten Rangfolge zugewiesen. Die Rangfolge des Operanden und des UNION
Ergebnisses wird nach Spalte ausgewertet.
Der Zuweisungsoperator ist sortierungsabhängig, und der rechte Ausdruck wird in die linke Sortierung umgewandelt.
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. Bei den UNION ALL
Anweisungen CASE
wird die Sortierung nicht beachtet, und allen Zeichenfolgenopernden und den enden Ergebnissen wird die Sortierbeschriftung des Operanden mit der höchsten Rangfolge zugewiesen. Die Rangfolge der Operanden und ergebnisse UNION ALL
wird nach Spalte ausgewertet.
Funktionen und Sortierung
THE CAST
, CONVERT
, und COLLATE
Funktionen sind sortierungsempfindlich für Zeichen-, Varchar- und Textdatentypen . Wenn es sich bei der Eingabe und Ausgabe der CAST
Funktionen CONVERT
um Zeichenfolgen handelt, weist die Ausgabezeichenfolge die Sortierbeschriftung der Eingabezeichenfolge auf. Wenn es sich bei der Eingabe nicht um eine Zeichenfolge handelt, ist die Ausgabezeichenfolge coercible-default und zugewiesen die Sortierung der aktuellen Datenbank für die Verbindung oder die Datenbank, die die benutzerdefinierte Funktion, gespeicherte Prozedur oder den Trigger enthält, auf die bzw. auf die CAST
CONVERT
verwiesen wird.
Für die integrierten Funktionen, die eine Zeichenfolge zurückgeben, aber keine Zeichenfolgeneingaben übernehmen, ist die Ergebniszeichenfolge "Coercible-default". Die Ergebniszeichenfolge wird entweder der Sortierung der aktuellen Datenbank oder der Sortierung der Datenbank zugewiesen, die die benutzerdefinierte Funktion, gespeicherte Prozedur oder den Trigger enthält, auf die 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