Rangfolge der Sortierung

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-Endpunkt in Microsoft FabricWarehouse 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, 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. 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 so re Standard für Fabric Warehouse, 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 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.  

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 ist das Resultset.

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 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;  

Hier 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;  

Hier ist das Resultset.

--------------------  
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 MAXOperatoren , MIN, BETWEEN, LIKEund 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 CASTCONVERT 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