Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Warehouse i Microsoft Fabric
Sorteringsprioritet, även kallat sorteringstvångsregler, avgör följande två resultat:
Sortering av slutresultatet av ett uttryck som utvärderas till en teckensträng.
Sortering som används av sorteringskänsliga operatorer som använder teckensträngsindata men inte returnerar en teckensträng, till exempel
LIKEoch IN.
Reglerna för sorteringsprioritet gäller endast för datatyperna teckensträng: tecken, varchar, text, nchar, nvarchar och ntext. Objekt som har andra datatyper deltar inte i sorteringsutvärderingar.
Sorteringsetiketter
I följande tabell visas och beskrivs de fyra kategorier där sorteringen av alla objekt identifieras. Namnet på varje kategori är sorteringsetiketten.
| Sorteringsetikett | Typer av objekt |
|---|---|
Coercible-default |
Alla Transact-SQL teckensträngsvariabel, parameter, literal eller utdata från en inbyggd katalogfunktion, eller en inbyggd funktion som inte tar strängindata utan genererar en strängutdata. Om objektet deklareras i en användardefinierad funktion, lagrad procedur eller utlösare tilldelas objektet standardsortering av databasen där funktionen, den lagrade proceduren eller utlösaren skapas. Om objektet deklareras i en batch tilldelas objektet standardsortering av den aktuella databasen för anslutningen. |
Implicit X |
En kolumnreferens. Sortering av uttrycket (X) hämtas från sorteringen som definierats för kolumnen i tabellen eller vyn. Även om kolumnen uttryckligen tilldelades en sortering med hjälp av en COLLATE sats i -instruktionen CREATE TABLE eller CREATE VIEW klassificeras kolumnreferensen som implicit. |
Explicit X |
Ett uttryck som uttryckligen omvandlas till en specifik sortering (X) med hjälp av en COLLATE sats i uttrycket. |
No-collation |
Anger att värdet för ett uttryck är resultatet av en åtgärd mellan två strängar som har motstridiga sortering av den implicita sorteringsetiketten. Uttrycksresultatet definieras som att det inte har någon sortering. |
Sorteringsregler
Sorteringsetiketten för ett enkelt uttryck som endast refererar till ett teckensträngsobjekt är sorteringsetiketten för det refererade objektet.
Sorteringsetiketten för ett komplext uttryck som refererar till två operanduttryck med samma sorteringsetikett är sorteringsetiketten för operanduttrycken.
Sorteringsetiketten för slutresultatet av ett komplext uttryck som refererar till två operanduttryck med olika sortering baseras på följande regler:
Explicit har företräde framför implicit. Implicit har företräde framför Coercible-default:
Explicit implicit >> tvångsstandard
Om du kombinerar två explicita uttryck som har tilldelats olika sortering genereras ett fel:
Explicit X + Explicit Y = Fel
Att kombinera två implicita uttryck som har olika sortering ger ett resultat av ingen sortering:
Implicit X + Implicit Y = Ingen sortering
Om du kombinerar ett uttryck med Ingen sortering med ett uttryck för en etikett, förutom explicit sortering (se följande regel), får du ett resultat som har etiketten Ingen sortering:
Ingen sortering + något = Ingen sortering
Om du kombinerar ett uttryck med ingen sortering med ett uttryck som har en explicit sortering ger det ett uttryck med en explicit etikett:
Ingen sortering + Explicit X = Explicit
I följande tabell sammanfattas reglerna.
| Etikett för operandtvång | Explicit X | Implicit X | Tvångsstandard | Ingen sortering |
|---|---|---|---|---|
Explicit Y |
Genererar fel | Resultatet är explicit Y | Resultatet är explicit Y | Resultatet är explicit Y |
Implicit Y |
Resultatet är explicit X | Resultatet är ingen sortering | Resultatet är implicit Y | Resultatet är ingen sortering |
Coercible-default |
Resultatet är explicit X | Resultatet är implicit X | Resultatet är tvångsstandard | Resultatet är ingen sortering |
No-collation |
Resultatet är explicit X | Resultatet är ingen sortering | Resultatet är ingen sortering | Resultatet är ingen sortering |
Följande ytterligare regler gäller även för sorteringsprioritet:
Du kan inte ha flera
COLLATEsatser i ett uttryck som redan är ett explicit uttryck. Följande sats är till exempelWHEREinte giltig eftersom enCOLLATEsats har angetts för ett uttryck som redan är ett explicit uttryck:WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_ASKodsidekonverteringar för textdatatyper tillåts inte. Du kan inte omvandla ett textuttryck från en sortering till en annan om de har de olika kodsidorna. Tilldelningsoperatorn kan inte tilldela värden när sortering av den högra textoperatorn har en annan kodsida än den vänstra textoperatorn.
Sorteringspriorence bestäms efter datatypskonvertering. Den operande som den resulterande sorteringen tas från kan skilja sig från operanden som tillhandahåller datatypen för slutresultatet. Tänk till exempel på följande batch:
CREATE TABLE TestTab
(
PrimaryKey INT PRIMARY KEY,
CharCol CHAR (10) COLLATE French_CI_AS
);
SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc';
Anmärkning
Nvarchar-datatypen stöds inte i Infrastrukturlager, men de flesta exempel i den här artikeln gäller för både varchar med UTF-8 och nvarchar, och gäller därför för Infrastrukturlager om inget annat anges.
Unicode-datatypen för det enkla uttrycket N'abc' har högre prioritet för datatypen. Därför har det resulterande uttrycket unicode-datatypen tilldelad till N'abc'. Uttrycket CharCol har dock en sorteringsetikett för Implicit och N'abc' har en lägre tvångsetikett som Tvångsstandard. Därför är French_CI_AS sorteringen som används sorteringen av CharCol.
Exempel på sorteringsregler
I följande exempel visas hur sorteringsreglerna fungerar. Om du vill köra exemplen skapar du följande testtabell.
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
Sorteringskonflikt och -fel
Predikatet i följande fråga har sorteringskonflikt och genererar ett fel.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;
Här är resultatet.
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.
Explicit etikett jämfört med implicit etikett
Predikatet i följande fråga utvärderas i sortering greek_ci_as eftersom rätt uttryck har etiketten Explicit. Detta har företräde framför den implicita etiketten för det vänstra uttrycket.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;
Här är resultatet.
id GreekCol LatinCol
----------- -------------------- --------------------
1 A a
Etiketter utan sortering
Anmärkning
På grund av skillnaden mellan beteendet för nvarchar och varchar i en UTF-8-sortering gäller inte det här exemplet i Infrastrukturlager.
Uttrycken i följande frågor har en etikett utan sortering. Därför CASE kan de inte visas i urvalslistan eller användas av sorteringskänsliga operatorer. Uttrycken kan dock användas av sorteringsokänsliga operatorer.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab;
Här är resultatet.
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;
Här är resultatet.
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;
Här är resultatet.
--------------------
a
Sorteringskänslig och sorteringsokänslig
Operatorer och funktioner är antingen sorteringskänsliga eller okänsliga.
- Sorteringskänslig: Det innebär att det är ett kompileringsfel att ange en operand utan sortering. Uttrycksresultatet får inte vara Ingen sortering.
- Sorteringsokänslig: Detta innebär att operanderna och resultatet kan vara ingen sortering.
Operatorer och sortering
Jämförelseoperatorerna och operatorerna MAX, MIN, BETWEEN, LIKEoch IN är sorteringskänsliga. Strängen som används av operatorerna tilldelas sorteringsetiketten för operanden som har högre prioritet. -instruktionen UNION är också sorteringskänslig och alla strängoperationer och slutresultatet tilldelas sortering av operand med högsta prioritet. Sorteringsprioriteten för UNION operand och resultat utvärderas kolumn för kolumn.
Tilldelningsoperatorn är sorteringsokänslig och det högra uttrycket gjuts till vänstersortering.
Strängsammanfogningsoperatorn är sorteringskänslig, de två strängoperationerna och resultatet tilldelas sorteringsetiketten för operanden med högsta sorteringsprioritet.
CASE Och UNION ALL -uttrycken är sorteringsokänsliga, och alla strängoperationer och de slutliga resultaten tilldelas sorteringsetiketten för operanden med högsta prioritet. Sorteringsprioriteten för UNION ALL operanderna och resultatet utvärderas kolumn för kolumn.
Funktioner och sortering
Funktionerna CAST, CONVERToch COLLATE är sorteringskänsliga för datatyperna char, varchar och text . Om indata och utdata för CAST funktionerna och CONVERT är teckensträngar har utdatasträngen sorteringsetiketten för indatasträngen. Om indata inte är en teckensträng är utdatasträngen Tvångsstandard och tilldelas sortering av den aktuella databasen för anslutningen, eller databasen som innehåller den användardefinierade funktionen, den lagrade proceduren eller utlösaren där CAST eller CONVERT refereras till.
För de inbyggda funktioner som returnerar en sträng men inte tar några strängindata är resultatsträngen Tvångsstandard. Resultatsträngen tilldelas antingen sortering av den aktuella databasen eller sortering av databasen som innehåller den användardefinierade funktionen, den lagrade proceduren eller utlösaren där funktionen refereras.
Följande funktioner är sorteringskänsliga och deras utdatasträngar har sorteringsetiketten för indatasträngen:
CHARINDEXDIFFERENCEISNUMERICLEFTLENLOWERPATINDEXREPLACEREVERSERIGHTSOUNDEXSTUFFSUBSTRINGUPPER