Udostępnij za pomocą


Pierwszeństwo sortowania

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Pierwszeństwo sortowania, nazywane również regułami sortowania, określa następujące dwa wyniki:

  • Sortowanie końcowego wyniku wyrażenia, które jest oceniane na ciąg znaków.

  • Sortowanie używane przez operatory wrażliwe na sortowanie, które używają danych wejściowych ciągów znaków, ale nie zwracają ciągu znaków, takiego jak LIKE i IN.

Reguły pierwszeństwa sortowania dotyczą tylko typów danych ciągów znaków: char, varchar, text, nchar, nvarchar i ntext. Obiekty, które mają inne typy danych, nie uczestniczą w ocenach sortowania.

Etykiety sortowania

W poniższej tabeli wymieniono i opisano cztery kategorie, w których są identyfikowane sortowania wszystkich obiektów. Nazwa każdej kategorii to etykieta sortowania.

Etykieta sortowania Typy obiektów
Coercible-default Każda Transact-SQL zmienna ciągu znaków, parametr, literał lub dane wyjściowe wbudowanej funkcji wykazu lub wbudowanej funkcji, która nie pobiera danych wejściowych ciągu, ale generuje dane wyjściowe ciągu.

Jeśli obiekt jest zadeklarowany w funkcji zdefiniowanej przez użytkownika, procedurze składowanej lub wyzwalaczu, obiekt jest przypisany do domyślnego sortowania bazy danych, w której jest tworzona funkcja, procedura składowana lub wyzwalacz. Jeśli obiekt jest zadeklarowany w partii, obiekt jest przypisany do domyślnego sortowania bieżącej bazy danych dla połączenia.
Implicit X Odwołanie do kolumny. Sortowanie wyrażenia (X) jest pobierane z sortowania zdefiniowanego dla kolumny w tabeli lub widoku.

Nawet jeśli kolumna została jawnie przypisana sortowaniu przy użyciu COLLATE klauzuli w instrukcji CREATE TABLE or CREATE VIEW , odwołanie do kolumny jest klasyfikowane jako niejawne.
Explicit X Wyrażenie jawnie rzutowane do określonego sortowania (X) przy użyciu COLLATE klauzuli w wyrażeniu.
No-collation Wskazuje, że wartość wyrażenia jest wynikiem operacji między dwoma ciągami, które mają sprzeczne sortowania niejawnej etykiety sortowania. Wynik wyrażenia jest definiowany jako brak sortowania.

Reguły sortowania

Etykieta sortowania prostego wyrażenia, które odwołuje się tylko do jednego obiektu ciągu znaków, jest etykietą sortowania obiektu, do którego odwołuje się odwołanie.

Etykieta sortowania wyrażenia złożonego odwołującego się do dwóch wyrażeń operandu z tą samą etykietą sortowania jest etykietą sortowania wyrażeń operandu.

Etykieta sortowania końcowego wyrażenia złożonego odwołującego się do dwóch wyrażeń operandu z różnymi sortowaniami jest oparta na następujących regułach:

  • Jawne ma pierwszeństwo przed niejawną. Niejawne ma pierwszeństwo przed ustawieniem Coercible-default:

    Jawna > niejawna > wartość domyślna

  • Połączenie dwóch wyrażeń jawnych, które zostały przypisane różne sortowania, generuje błąd:

    Jawne X + Jawne Y = Błąd

  • Połączenie dwóch wyrażeń niejawnych z różnymi sortowaniami daje wynik sortowania bez sortowania:

    Niejawne X + Niejawne Y = bez sortowania

  • Połączenie wyrażenia z wyrażeniem Bez sortowania z wyrażeniem dowolnej etykiety, z wyjątkiem sortowania jawnego (zobacz następującą regułę), daje wynik z etykietą Bez sortowania:

    Brak sortowania + nic = bez sortowania

  • Połączenie wyrażenia z wyrażeniem Bez sortowania z wyrażeniem, które ma sortowanie jawne, daje wyrażenie z etykietą jawną:

    Bez sortowania + Jawne X = Jawne

Poniższa tabela zawiera podsumowanie reguł.

Etykieta przymusu operandu Jawne X Niejawne X Coercible-default Bez sortowania
Explicit Y Generuje błąd Wynik jest jawny Y Wynik jest jawny Y Wynik jest jawny Y
Implicit Y Wynik jest jawny X Wynik to brak sortowania Wynik jest niejawny Y Wynik to brak sortowania
Coercible-default Wynik jest jawny X Wynik jest niejawny X Wynik jest coercible-default Wynik to brak sortowania
No-collation Wynik jest jawny X Wynik to brak sortowania Wynik to brak sortowania Wynik to brak sortowania

Następujące dodatkowe reguły dotyczą również pierwszeństwa sortowania:

  • Nie można mieć wielu COLLATE klauzul w wyrażeniu, które jest już wyrażeniem jawnym. Na przykład następująca WHERE klauzula nie jest prawidłowa, ponieważ klauzula COLLATE jest określona dla wyrażenia, które jest już wyrażeniem jawnym:

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

  • Konwersje stron kodowych dla typów danych tekstowych nie są dozwolone. Nie można rzutować wyrażenia tekstowego z jednego sortowania do innego, jeśli mają różne strony kodu. Operator przypisania nie może przypisać wartości, gdy sortowanie prawego operandu tekstowego ma inną stronę kodową niż lewy operand tekstu.

Pierwszeństwo sortowania jest określane po konwersji typu danych. Operand, z którego jest wykonywane sortowanie wynikowe, może różnić się od operandu, który dostarcza typ danych końcowego wyniku. Rozważmy na przykład następującą partię:

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

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

Uwaga / Notatka

Typ danych nvarchar nie jest obsługiwany w magazynie sieci szkieletowej, ale większość przykładów w tym artykule ma zastosowanie zarówno do varchar przy użyciu formatu UTF-8, jak i nvarchar, a więc pozostają stosowane do magazynu sieci szkieletowej, chyba że określono inaczej.

Typ danych Unicode wyrażenia prostego N'abc' ma wyższy priorytet typu danych. W związku z tym wynikowe wyrażenie ma typ danych Unicode przypisany do elementu N'abc'. Jednak wyrażenie CharCol ma etykietę sortowania niejawną i N'abc' ma niższą etykietę przymusu coercible-default. W związku z tym używane sortowanie to sortowanie French_CI_ASelementu CharCol .

Przykłady reguł sortowania

W poniższych przykładach pokazano, jak działają reguły sortowania. Aby uruchomić przykłady, utwórz poniższą tabelę testowa.

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

Konflikt sortowania i błąd

Predykat w poniższym zapytaniu zawiera konflikt sortowania i generuje błąd.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;

Oto zestaw wyników.

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.

Etykieta jawna a etykieta niejawna

Predykat w poniższym zapytaniu jest obliczany w sortowaniu greek_ci_as , ponieważ odpowiednie wyrażenie ma etykietę Jawna. Ma to pierwszeństwo przed etykietą Niejawną wyrażenia po lewej stronie.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

Oto zestaw wyników.

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

Brak etykiet sortowania

Uwaga / Notatka

Ze względu na różnicę między zachowaniem nvarchar i varchar w sortowaniu UTF-8 ten przykład nie ma zastosowania w magazynie sieci szkieletowej.

Wyrażenia CASE w poniższych zapytaniach mają etykietę Bez sortowania, dlatego nie mogą być wyświetlane na liście wyboru ani obsługiwane przez operatory z uwzględnieniem sortowania. Wyrażenia mogą być jednak obsługiwane przez operatory niewrażliwe na sortowanie.

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

Oto zestaw wyników.

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;

Oto zestaw wyników.

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;

Oto zestaw wyników.

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

Niewrażliwe sortowanie i sortowanie

Operatory i funkcje są wrażliwe na sortowanie lub niewrażliwe.

  • Uwzględnianie sortowania: oznacza to, że określenie operandu sortowania nie jest błędem czasu kompilacji. Wynik wyrażenia nie może być sortowaniem bez sortowania.
  • Bez uwzględniania sortowania: oznacza to, że operandy i wynik mogą mieć wartość Bez sortowania.

Operatory i sortowanie

Operatory porównania i MAXoperatory , MIN, BETWEEN, LIKEi IN są wrażliwe na sortowanie. Ciąg używany przez operatory ma przypisaną etykietę sortowania operandu, który ma wyższy priorytet. Instrukcja UNION jest również wrażliwa na sortowanie, a wszystkie operandy ciągów i końcowy wynik jest przypisywany sortowanie operandu o najwyższym pierwszeństwie. Pierwszeństwo sortowania operandu UNION i wyniku są obliczane według kolumny.

Operator przypisania jest niewrażliwy na sortowanie, a prawe wyrażenie jest rzutowanie do sortowania po lewej stronie.

Operator łączenia ciągów jest wrażliwy na sortowanie, dwa operandy ciągów i wynik są przypisywane etykiety sortowania operandu z najwyższym pierwszeństwem sortowania. Instrukcje UNION ALL i CASE są niewrażliwe na sortowanie, a wszystkie operandy ciągów i końcowe wyniki mają przypisaną etykietę sortowania operandu o najwyższym pierwszeństwie. Pierwszeństwo UNION ALL sortowania operandów i wyniku są obliczane według kolumny.

Funkcje i sortowanie

Funkcje CAST, CONVERTi COLLATE są wrażliwe na sortowanie dla typów danych char, varchar i text . Jeśli dane wejściowe i wyjściowe CAST funkcji i CONVERT są ciągami znaków, ciąg wyjściowy zawiera etykietę sortowania ciągu wejściowego. Jeśli dane wejściowe nie są ciągami znaków, ciąg wyjściowy jest coercible-default i przypisano sortowanie bieżącej bazy danych dla połączenia lub bazy danych zawierającej funkcję zdefiniowaną przez użytkownika, procedurę składowaną lub wyzwalacz, w którym CAST występuje odwołanie do lub CONVERT .

W przypadku wbudowanych funkcji, które zwracają ciąg, ale nie przyjmują danych wejściowych ciągu, ciąg wynikowy jest coercible-default. Ciąg wyniku jest przypisywany do sortowania bieżącej bazy danych lub sortowania bazy danych zawierającej funkcję zdefiniowaną przez użytkownika, procedurę składowaną lub wyzwalacz, do którego odwołuje się funkcja.

Następujące funkcje są wrażliwe na sortowanie, a ich ciągi wyjściowe mają etykietę sortowania ciągu wejściowego:

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