Delen via


Sorteringsprioriteit

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft Fabric

Sorteringsprioriteit, ook wel sorteringsregels genoemd, bepaalt de volgende twee resultaten:

  • De sortering van het uiteindelijke resultaat van een expressie die wordt geëvalueerd op een tekenreeks.

  • De sortering die wordt gebruikt door sorteringsgevoelige operators die tekenreeksinvoer gebruiken, maar geen tekenreeks retourneren, zoals LIKE en IN.

De sorteringsregels zijn alleen van toepassing op de tekenreeksgegevenstypen : char, varchar, text, nchar, nvarchar en ntext. Objecten met andere gegevenstypen nemen niet deel aan sorteringsevaluaties.

Sorteringslabels

De volgende tabel bevat en beschrijft de vier categorieën waarin de sorteringen van alle objecten worden geïdentificeerd. De naam van elke categorie is het sorteringslabel.

Sorteringslabel Typen objecten
Coercible-default Elke Transact-SQL tekenreeksvariabele, parameter, letterlijke waarde of de uitvoer van een ingebouwde catalogusfunctie of een ingebouwde functie die geen tekenreeksinvoer accepteert, maar een tekenreeksuitvoer produceert.

Als het object is gedeclareerd in een door de gebruiker gedefinieerde functie, opgeslagen procedure of trigger, krijgt het object de standaardsortering van de database waarin de functie, opgeslagen procedure of trigger wordt gemaakt. Als het object in een batch wordt gedeclareerd, wordt aan het object de standaardsortering van de huidige database voor de verbinding toegewezen.
Implicit X Een kolomreferentie. De sortering van de expressie (X) wordt genomen uit de sortering die is gedefinieerd voor de kolom in de tabel of weergave.

Zelfs als aan de kolom expliciet een sortering is toegewezen met behulp van een COLLATE component in de CREATE TABLE or-instructie CREATE VIEW , wordt de kolomreferentie geclassificeerd als impliciet.
Explicit X Een expressie die expliciet wordt omgezet in een specifieke sortering (X) met behulp van een COLLATE component in de expressie.
No-collation Geeft aan dat de waarde van een expressie het resultaat is van een bewerking tussen twee tekenreeksen die conflicterende sorteringen van het impliciete sorteringslabel hebben. Het expressieresultaat wordt gedefinieerd als geen sortering.

Sorteringsregels

Het sorteringslabel van een eenvoudige expressie die verwijst naar slechts één tekenreeksobject is het sorteringslabel van het object waarnaar wordt verwezen.

Het sorteringslabel van een complexe expressie die verwijst naar twee operandexpressies met hetzelfde sorteringslabel is het sorteringslabel van de operand-expressies.

Het sorteringslabel van het uiteindelijke resultaat van een complexe expressie die verwijst naar twee operand-expressies met verschillende sorteringen, is gebaseerd op de volgende regels:

  • Expliciet heeft voorrang op impliciet. Impliciet heeft voorrang op Coercible-default:

    Expliciete > impliciete > coercible-standaard

  • Als u twee expliciete expressies combineert waaraan verschillende sorteringen zijn toegewezen, wordt er een fout gegenereerd:

    Expliciete X + Expliciete Y = Fout

  • Het combineren van twee impliciete expressies met verschillende sorteringen resulteert in een resultaat van geen sortering:

    Impliciete X + impliciete Y = Geen sortering

  • Als u een expressie combineert met geen sortering met een expressie van een label, met uitzondering van expliciete sortering (zie de volgende regel), resulteert dit in een resultaat met het label Geen sortering:

    Geen sortering + iets = Geen sortering

  • Als u een expressie combineert met geen sortering met een expressie met een expliciete sortering, resulteert dit in een expressie met een expliciet label:

    Geen sortering + Expliciet x = Expliciet

De volgende tabel bevat een overzicht van de regels.

Operand coercion label Expliciete X Impliciete X Coercible-default Geen sortering
Explicit Y Genereert een fout Resultaat is expliciet Y Resultaat is expliciet Y Resultaat is expliciet Y
Implicit Y Resultaat is Expliciet X Resultaat is geen sortering Resultaat is impliciete Y Resultaat is geen sortering
Coercible-default Resultaat is Expliciet X Resultaat is impliciet x Resultaat is coercible-default Resultaat is geen sortering
No-collation Resultaat is Expliciet X Resultaat is geen sortering Resultaat is geen sortering Resultaat is geen sortering

De volgende aanvullende regels zijn ook van toepassing op sorteringsprioriteit:

  • U kunt niet meerdere COLLATE componenten hebben voor een expressie die al een expliciete expressie is. De volgende WHERE component is bijvoorbeeld niet geldig omdat er een COLLATE component is opgegeven voor een expressie die al een expliciete expressie is:

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

  • Codepaginaconversies voor tekstgegevenstypen zijn niet toegestaan. U kunt een tekstexpressie van de ene sortering niet naar een andere cast casten als deze de verschillende codepagina's heeft. De toewijzingsoperator kan geen waarden toewijzen wanneer de sortering van de rechtertekstoperand een andere codepagina heeft dan de linkertekstoperand.

De prioriteit van sortering wordt bepaald na de conversie van het gegevenstype. De operand van waaruit de resulterende sortering wordt genomen, kan afwijken van de operand die het gegevenstype van het uiteindelijke resultaat levert. Denk bijvoorbeeld aan de volgende batch:

CREATE TABLE TestTab
(
    PrimaryKey INT PRIMARY KEY,
    CharCol CHAR (10) COLLATE French_CI_AS
);

SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc';

Opmerking

Het gegevenstype nvarchar wordt niet ondersteund in Fabric Warehouse, maar de meeste voorbeelden in dit artikel zijn van toepassing op zowel varchar met UTF-8 als nvarchar, en blijven dus van toepassing op Fabric Warehouse, tenzij anders vermeld.

Het Unicode-gegevenstype van de eenvoudige expressie N'abc' heeft een hogere prioriteit voor het gegevenstype. Daarom is aan de resulterende expressie het Unicode-gegevenstype toegewezen N'abc'. De expressie CharCol heeft echter een sorteringslabel impliciet en N'abc' heeft een lager coercionlabel van coercible-default. Daarom is de sortering die wordt gebruikt de French_CI_AS sortering van CharCol.

Voorbeelden van sorteringsregels

In de volgende voorbeelden ziet u hoe de sorteringsregels werken. Als u de voorbeelden wilt uitvoeren, maakt u de volgende testtabel.

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

Sorteringsconflict en -fout

Het predicaat in de volgende query heeft een sorteringsconflict en genereert een fout.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;

Hier is het resultatenoverzicht.

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.

Expliciet label versus impliciet label

Het predicaat in de volgende query wordt geëvalueerd in sortering greek_ci_as omdat de juiste expressie het expliciete label heeft. Dit heeft voorrang op het impliciete label van de linkerexpressie.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

Hier is het resultatenoverzicht.

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

Geen sorteringslabels

Opmerking

Vanwege het verschil tussen het gedrag van nvarchar en varchar in een UTF-8-sortering, is dit voorbeeld niet van toepassing in Fabric Warehouse.

De CASE expressies in de volgende query's hebben een label zonder sortering. Daarom kunnen ze niet worden weergegeven in de selectielijst of worden uitgevoerd door sorteringsgevoelige operators. De expressies kunnen echter worden gebruikt door sorteringsgevoelige operatoren.

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

Hier is het resultatenoverzicht.

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 is het resultatenoverzicht.

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 is het resultatenoverzicht.

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

Sorteringsgevoelige en sorteringsgevoelige

Operators en functies zijn sorteringsgevoelig of niet gevoelig.

  • Sorteringsgevoelig: dit betekent dat het opgeven van een operand zonder sortering een compilatiefout is. Het resultaat van de expressie kan geen sortering zijn.
  • Sortering is niet gevoelig: dit betekent dat de operanden en het resultaat geen sortering kunnen zijn.

Operators en sortering

De vergelijkingsoperatoren, en de MAXoperatoren , MIN, BETWEENLIKEen IN operators, zijn sorteringsgevoelig. Aan de tekenreeks die door de operators wordt gebruikt, wordt het sorteringslabel toegewezen van de operand met de hogere prioriteit. De UNION instructie is ook sorteringsgevoelig en alle tekenreeksoperanden en het uiteindelijke resultaat wordt de sortering van de operand met de hoogste prioriteit toegewezen. De sorteringsprioriteit van de operand en het UNION resultaat worden per kolom geëvalueerd.

De toewijzingsoperator is niet gevoelig voor sortering en de rechterexpressie wordt naar de linkersortering gecast.

De tekenreekssamenvoegingsoperator is sorteringsgevoelig, de twee tekenreeksoperanden en het resultaat krijgen het sorteringslabel van de operand met de hoogste sorteringsprioriteit toegewezen. De UNION ALL en CASE instructies zijn niet hoofdlettergevoelig voor sortering en alle tekenreeksoperanden en de uiteindelijke resultaten krijgen het sorteringslabel van de operand met de hoogste prioriteit toegewezen. De sorteringsprioriteit van de operanden en het UNION ALL resultaat worden per kolom geëvalueerd.

Functies en sortering

De CAST, CONVERTen COLLATE functies zijn sorteringsgevoelig voor gegevenstypen voor tekens, varchar en tekst . Als de invoer en uitvoer van de CAST en CONVERT functies tekenreeksen zijn, heeft de uitvoertekenreeks het sorteringslabel van de invoertekenreeks. Als de invoer geen tekenreeks is, is de uitvoertekenreeks coercible-standaard en wordt de sortering van de huidige database toegewezen voor de verbinding, of de database die de door de gebruiker gedefinieerde functie, opgeslagen procedure of trigger bevat waarnaar wordt CAST verwezen of CONVERT waarnaar wordt verwezen.

Voor de ingebouwde functies die een tekenreeks retourneren, maar geen tekenreeksinvoer gebruiken, is de resultaattekenreeks coercible-default. De resultaattekenreeks wordt toegewezen aan de sortering van de huidige database of aan de sortering van de database die de door de gebruiker gedefinieerde functie, opgeslagen procedure of trigger bevat waarnaar naar de functie wordt verwezen.

De volgende functies zijn sorteringsgevoelig en de uitvoertekenreeksen hebben het sorteringslabel van de invoertekenreeks:

  • CHARINDEX
  • DIFFERENCE
  • ISNUMERIC
  • LEFT
  • LEN
  • LOWER
  • PATINDEX
  • REPLACE
  • REVERSE
  • RIGHT
  • SOUNDEX
  • STUFF
  • SUBSTRING
  • UPPER