Pierwszeństwo sortowanie (języka Transact-SQL)

Priorytet sortowanie, nazywane także zasadami przymus sortowanie określa następujące czynności:

  • Sortowanie ostateczny wynik wyrażenie, której wartość jest wyznaczana na ciąg znaków.

  • Ciąg danych wejściowych sortowanie, który jest używany przez operatorów liter sortowanie znaków, lecz nie zwracają ciąg znaków, takie jak LIKE i IN.

Reguły pierwszeństwa sortowanie stosuje się tylko do danych typu ciąg znaków: char, varchar, text, nchar, nvarchar, a ntext. Obiekty, które mają inne typy danych nie będących składowymi ocen sortowanie.

Etykiety sortowanie

W poniższej tabela wymieniono i opisano cztery kategorie, w którym są identyfikowane sortowania wszystkich obiektów.Nazwa każdej kategorii jest określany jako etykieta sortowanie.

Etykieta sortowanie

Typy obiektów

Domyślne Coercible

Wszystkie Transact-SQL zmiennej ciągu znaków, parametr, literału lub danych wyjściowych katalogu wbudowanych funkcja lub wbudowanych funkcja, nie zajmuje ciąg danych wejściowych, które produkuje wyjściowy ciąg znaków.

Jeśli obiekt jest zadeklarowana w funkcja zdefiniowanej przez użytkownika, procedurą przechowywaną lub wyzwalacza, obiekt jest przypisany domyślny sortowanie bazy danych, w której została utworzona funkcja, procedur przechowywanych i wyzwalaczy.Jeśli obiekt jest zadeklarowany w partia, obiekt zostanie przypisany domyślnym sortowaniem bieżącej bazy danych dla połączenia.

Niejawna X

Odwołanie do kolumna.Sortowanie wyrażenie (X) jest pobierana z kolumna w tabela lub widoku sortowania.

Nawet wtedy, gdy kolumna został jawnie przypisane sortowanie za pomocą klauzula COLLATE w instrukcja CREATE tabela lub CREATE VIEW, są klasyfikowane jako niejawne odwołanie do kolumna.

Jawne X

Wyrażenie, które jawnie oddane do określonego sortowanie (X) przy użyciu klauzula COLLATE w wyrażeniu.

Nr sortowanie

Wskazuje, że wartość wyrażenie jest wynik operacji między dwa ciągi, które mają powodujące konflikt ustawienia sortowanie etykiety niejawna sortowanie.Wynikiem wyrażenie jest definiowana jako nie ma potrzeby sortowanie.

Reguły sortowanie

Etykieta sortowanie proste wyrażenie odwołuje się tylko jeden obiekt ciąg znaków jest etykieta sortowania obiektu, do którego istnieje odwołanie.

Etykieta Sortowanie złożone wyrażenie odwołujące się do dwóch wyrażeń operand etykietą sortowania jest etykieta sortowania wyrażeń operand.

Etykieta sortowanie ostateczny wynik złożone wyrażenie odwołujące się do dwóch wyrażeń operand z różnych ustawień sortowanie jest oparty na następujących zasad:

  • Jawne ma wyższy priorytet niż domyślny.Niejawna ma pierwszeństwo przed Coercible domyślne:

    Jawne > Niejawna > Domyślne Coercible

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

    Jawne X + Y jawnych = błąd

  • Łącząc dwa wyrażenia niejawnego, które mają różne metody sortowanie daje wynik sortowanie nie:

    Niejawna X + Y niejawnego = nr sortowanie

  • Łączenie wyrażenie o nr sortowanie na wyrażenie każdej etykiety, z wyjątkiem jawne sortowanie (zob. Poniższa reguła), zwraca wynik, który ma etykietę nr sortowanie:

    Sortowanie nie + niczego = nr sortowania

  • Łączenie wyrażenie o nr sortowanie z wyrażenie, które zawiera jawne sortowanie, daje etykietą jawne wyrażenie:

    Sortowanie nie + jawne X = jawne

Poniższa tabela zawiera podsumowanie reguł.

Operand przymus etykiety

Jawne X

Niejawna X

Domyślne Coercible

Nr sortowanie

Jawne Y

Generuje błąd

Wynik jest jawne Y

Wynik jest jawne Y

Wynik jest jawne Y

Niejawna Y

Wynik jest jawne X

Wynik jest sortowanie nr

Wynik jest niejawnego Y

Wynik jest sortowanie nr

Domyślne Coercible

Wynik jest jawne X

Wynik jest niejawnego X

Wynik jest domyślnie Coercible

Wynik jest sortowanie nr

Nr sortowanie

Wynik jest jawne X

Wynik jest sortowanie nr

Wynik jest sortowanie nr

Wynik jest sortowanie nr

Następujące dodatkowe zasady dotyczą także priorytet sortowanie:

  • Nie można mieć wiele klauzul COLLATE na wyrażenie, które jest już jawne wyrażenie.Na przykład następujące WHERE Klauzula nie jest prawidłowym ponieważ COLLATE Klauzula jest określony dla wyrażenia, która jest już jawne wyrażenie:

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

  • Konwersje strona kodu dla text typy danych nie są dozwolone. Nie można rzutować text wyrażenie z sortowanie jednej do drugiej, jeśli mają one strony kodowe inne. Operator przypisania nie można przypisać wartości podczas sortowanie argumentu po prawej tekst ma inną strona kodowa niż argument tekstu z lewej.

Priorytet sortowanie zależy po konwersji typu danych.Operand, z którego pochodzi sortowanie wynikowy może być inny niż operator, który dostarcza typu danych wyniku końcowego.Na przykład należy wziąć pod uwagę następujących zadań wsadowych:

CREATE TABLE TestTab
   (PrimaryKey int PRIMARY KEY,
    CharCol char(10) COLLATE French_CI_AS
   )

SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc'

Typ danych Unicode proste wyrażenie N'abc' ma wyższy priorytet typu danych. W związku z tym wynikowy wyrażenie ma przypisany do typu danych Unicode N'abc'. Jednak wyrażenie CharCol Etykieta sortowanie z niejawna, a N'abc' ma niższy etykiety przymus Coercible domyślnego. W związku z tym sortowania, który jest używany jest French_CI_AS Sortowanie CharCol.

Przykłady reguł sortowanie

Następujące przykłady przedstawiają sposób działania reguły sortowanie.Aby uruchomić przykłady, Utwórz w poniższej tabela testu.

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

Sortowanie powodujących konflikt i błąd

Predykat w następującej kwerendzie ma konfliktu sortowanie i generuje błąd.

SELECT * 
FROM TestTab 
WHERE GreekCol = LatinCol;

Here is the result set.

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.

Jawne a etykiet.Niejawna etykiet

Predykat w następującej kwerendzie sprawdzana jest zgodność podczas sortowanie greek_ci_as ponieważ wyrażenie po prawej ma jawne etykiety. To ma pierwszeństwo przed niejawnego etykiet lewej wyrażenie.

SELECT * 
FROM TestTab 
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

Here is the result set.

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

(1 row affected)

Sortowanie nie etykiety

The CASE expressions in the following queries have a No-sortowanie label; therefore, they cannot appear in the select list or be operated on by sortowanie-sensitive operators. Jednak wyrażenia mogą być obsługiwane na operatorami niewrażliwe sortowanie.

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

Here is the result set.

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;

Here is the result set.

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;

Here is the result set.

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

(1 row affected)

Uwzględnij sortowania i sortowanie niewrażliwe

Operatory i funkcje są albo sortowanie poufnych lub niewrażliwe.

  • Wielkość liter sortowanie
    Oznacza to, że określenie argumentu sortowanie nie jest błąd w czasie kompilacji.Wynikiem wyrażenie nie może być nr sortowanie.

  • Sortowanie niewrażliwe
    Oznacza to, że sortowanie nie mogą być argumentów i wyniku.

Operatory i sortowanie

Operatory porównania i MAX, MIN, BETWEEN LIKE i w operatorów, to sortowanie wielkość liter.Ciąg używany przez operatorów jest przypisywana etykieta sortowanie argumentu, który ma wyższy priorytet.UNION operator jest również sortowanie wielkość liter, a wszystkie argumenty ciąg znaków i wyniku końcowego przypisano o najwyższym priorytecie sortowanie operandu.Priorytet sortowanie UNION argumentów i wyniku są oceniane kolumnami.

Operator przypisania jest sortowanie niewrażliwe i wyrażenie po prawej jest rzutować na lewym sortowania.

Operator łączenie ciąg jest sortowanie niewrażliwe, w ciąg dwóch argumentów i wyniku są przypisywane etykiety sortowania operandu o najwyższym priorytecie sortowania.Operatory UNION ALL i przypadek są niewrażliwe sortowanie, a wszystkie argumenty ciąg znaków i wyniki końcowe są przypisywane etykiety sortowanie operandu o najwyższym priorytecie.Priorytet sortowanie Unii wszystkich argumentów i wyniku są oceniane kolumna po kolumnie.

Funkcje i sortowanie

Funkcje CAST CONVERT i COLLATE są ważne dla sortowanie char, varchar, a text typy danych. Jeśli dane wejściowe i wyjściowe funkcji CAST i CONVERT ciągi znaków, ciąg wyjściowy ma etykietę sortowanie ciągu wejściowego.Jeśli dane wejściowe nie jest ciągiem znaków, ciąg wyjściowy jest domyślnym Coercible i przypisać sortowanie bieżącej bazy danych dla połączenia lub bazy danych, która zawiera funkcja zdefiniowaną przez użytkownika, procedurą przechowywaną lub wyzwalacz, w której istnieje odwołanie CAST lub CONVERT.

Dla funkcje wbudowane zwracać ciąg, ale czy nie mają danych wejściowych ciąg, ciąg wyniku jest domyślnym Coercible i jest przypisany sortowanie bieżącej bazy danych lub sortowanie bazy danych, która zawiera funkcję zdefiniowaną przez użytkownika, procedura przechowywana, albo wywoływany, w którym odwołuje się funkcja.

Następujące funkcje są zależne od sortowanie i ich ciągów wyjściowych mają etykietę sortowanie ciąg wejściowy:

CHARINDEX

ZAMIEŃ

RÓŻNICA

ODWRACANIE

ISNUMERIC

W PRAWO

W LEWO

SOUNDEX

LEN

ELEMENTY

LITMAŁE

PODCIĄG

PATINDEX

LITWIELKIE