Priorytet sortowania języka Transact-SQL)
Priorytet sortowania, znane również jako zasady przymus sortowanie określa następujące czynności:
sortowanie końcowego wyniku wyrażenie , które jest szacowany na ciągznaków.
sortowanie jest używany przez sortowanie-wrażliwe operatorów, które nakładów ciąg znaków, ale nie zwróci znak ciąg, takich jak podobne i IN.
sortowanie pierwszeństwo zasady dotyczą tylko typy danych ciąg znaków: char, varchar, text, nchar, nvarchar, and ntext.Obiekty, które mają inne typy danych, które nie uczestniczą w ocen sortowanie .
Sortowanie etykiety
W poniższej tabela wymieniono i opisano cztery kategorie, w których są identyfikowane sortowania wszystkich obiektów.Nazwa każdej kategorii nosi nazwę etykiety sortowanie .
Etykieta sortowania |
Typy obiektów |
---|---|
Domyślne Coercible |
Każdy Transact-SQL zmiennej ciąg znaków, parametr, literału lub danych wyjściowych katalogu wbudowanych funkcja, lub wbudowanych funkcja , nie ma danych wejściowych ciąg , ale generuje dane wyjściowe ciąg . Jeśli obiekt jest zadeklarowany w zdefiniowanej przez użytkownika funkcja, procedura składowanalub wyzwalacza, obiekt przypisano domyślne sortowanie bazy danych, w której została utworzona funkcja, procedura składowanalub wyzwalacza.Jeśli obiekt jest zadeklarowany w partia, obiekt przypisano domyślne sortowanie bieżącej bazy danych dla połączenia. |
Niejawna X |
Odwołanie do kolumna .sortowanie wyrażenie (X) jest pobierana z sortowanie kolumna w tabela lub widoku. Nawet jeśli kolumna został jawnie przypisane sortowanie przy użyciu klauzula COLLATE CREATE TABLE lub CREATE VIEW instrukcja, jest klasyfikowany jako niejawne odwołanie do kolumna . |
Jawne X |
wyrażenie , które jawnie oddanych do określonego sortowanie (X) przy użyciu klauzula COLLATE w wyrażenie. |
Nr -sortowanie |
Wskazuje, że wartość wyrażenie jest wynik operacji między dwa ciągi zawierające konfliktowe sortowania etykieta niejawna sortowanie .Wynikiem wyrażenie jest zdefiniowana jako nie ma potrzeby sortowanie. |
Reguły sortowania
Etykieta sortowanie proste wyrażenie , które odwołuje się tylko jeden obiekt ciąg znaków jest etykieta sortowanie odwołanie obiektu.
Etykieta sortowanie złożone wyrażenie odwołujący się do dwóch wyrażeń operand etykietą sortowanie jest etykieta sortowanie operandu wyrażenia.
Etykieta sortowanie ostateczny wynik złożone wyrażenie , które odwołuje się do dwóch wyrażeń operand z różnych ustawień sortowania jest oparty na następujących zasad:
Jawne pierwszeństwo niejawne.Niejawna mają pierwszeństwo przed Coercible domyślne:
Jawne > niejawna > Coercible domyślna
Łą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
Łączenie dwóch wyrażeń niejawne, które mają różne ustawienia sortowania daje wynik nr -sortowanie:
Niejawna X + Y niejawna = nr -sortowanie
Połączenie wyrażenie z nr -sortowanie z wyrażenie , wszelkie etykiety, z wyjątkiem wyraźnej sortowanie (patrz Poniższa reguła) daje wynik, który ma etykietęsortowanie nr:
Nr -sortowanie + cokolwiek = nr -sortowanie
Połączenie wyrażenie z nr -sortowanie z wyrażenie , które ma wyraźne sortowanie, daje wyrażenie z etykietą jawne:
Nr -sortowanie + X jawnych = 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 nr -sortowanie |
Wynik jest niejawny y |
Wynik jest nr -sortowanie |
Domyślne Coercible |
Wynik jest jawne x |
Wynik jest niejawny x |
Wynik jest domyślne Coercible |
Wynik jest nr -sortowanie |
Nr -sortowanie |
Wynik jest jawne x |
Wynik jest nr -sortowanie |
Wynik jest nr -sortowanie |
Wynik jest nr -sortowanie |
Następujące dodatkowe reguły stosuje się także priorytet sortowanie :
Na wyrażenie , które jest już jawne wyrażenienie może mieć wiele klauzul SORTUJ.Na przykład, następujący WHERE klauzula jest nieprawidłowa ponieważ COLLATE klauzula jest określony dla wyrażenie , które jest już jawne wyrażenie:
WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS
Kod konwersje strona dla text typy danych nie są dozwolone.Nie można rzutować text wyrażenie z jednego sortowanie do innej, jeśli mają one różne strony kodowe.operator przypisania nie można przypisać wartości podczas sortowanie operand po prawej tekst ma inną strona kodowa niż argument tekstu z lewej.
Priorytet sortowania ustala się po konwersji typu danych.Operand, z którego pochodzi wyniki sortowanie może różnić się od argumentu, który dostarcza typu danych wyniku końcowego.Na przykład rozważmy następującą partia:
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ższą dane, wpisz priorytet.W związku z tym, wynikowy wyrażenie ma typ danych Unicode, przypisane do N'abc'.Jednak wyrażenie CharCol zawiera etykietę sortowanie niejawna, i N'abc' zawiera etykietę przymus niższe Coercible-domyślny.W związku z tym, sortowanie , który jest używany jest French_CI_AS sortowanie CharCol.
Przykłady reguł sortowania
Poniższe przykłady pokazują, jak działają reguły sortowanie .Aby uruchomić przykłady, należy utworzyć następujące badania tabela.
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 elementów powodujących konflikt i błąd
Predykat w następującej kwerendzie ma konflikt sortowanie 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.
Jawne etykiety.Etykieta niejawne
Predykat w następującej kwerendzie jest oceniany w sortowanie greek_ci_as , ponieważ ma prawo wyrażenie wyraźnej etykiety.Niejawna Etykieta lewa wyrażenieto ma pierwszeństwo.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;
Oto zestaw wyników.
id GreekCol LatinCol
----------- -------------------- --------------------
1 A a
(1 row affected)
Nr sortowania etykiet
CASE Wyrażeń w kwerendach następujące mają nr - etykietasortowanie ; w związku z tym, nie są wyświetlane na liście select lub eksploatowanych na przez sortowanie-wrażliwych operatorów.Jednak wyrażenia mogą być sterowane na przez sortowanie-niewrażliwe operatorów.
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
(1 row affected)
Sortowanie wrażliwe oraz niewrażliwe sortowania
Operatory i funkcje są albo sortowanie poufne lub niewrażliwe.
Wielkość liter sortowania
Oznacza to, że określanie nr -sortowanie operand jest błądczas kompilacji.Wynikiem wyrażenie nie może być nr -sortowanie.Sortowanie niewrażliwe
Oznacza to, że argumentów i wyniku może być nr -sortowanie.
Operatory i sortowania
Operatory porównania oraz MAX, MIN, między jak i podmiotów gospodarczych, są wrażliwe sortowanie .ciąg używany przez podmioty gospodarcze jest przypisywana etykieta sortowanie argumentu, który ma wyższy priorytet.UNION operator jest również sortowanie poufne i wszystkie argumenty ciąg i ostateczny wynik jest przypisany sortowanie operandu o najwyższym priorytecie.Priorytet sortowanie Unii argumentów i wyniku są ocenione kolumna według kolumna.
operator przypisania jest sortowanie niewrażliwe i prawo wyrażenie jest oddanych do lewej sortowanie.
łączenie ciągoperator jest sortowanie niewrażliwe, dwa operandy ciąg i wynik są przypisane etykiety sortowanie operandu o najwyższym priorytecie sortowanie . sortowanie niewrażliwe są operatory UNION ALL i sprawy i wszystkie argumenty ciąg i końcowe wyniki są przypisane etykiety sortowanie operandu o najwyższym priorytecie.Priorytet sortowanie Unii wszystkich argumentów i wyniku są oceniane kolumna po kolumna.
Funkcje i sortowania
Funkcje RZUTOWANIA, konwersja i SORTUJ są sortowanie poufne dla char, varchar, i text typów danych.Jeśli dane wejściowe i wyjściowe funkcji WYTOPU i konwertowanie ciągów znaków, wyjściowy ciąg ma etykieta sortowanie ciągwejściowy.Jeśli dane wejściowe nie jest ciągznaków, wyjściowy ciąg jest domyślnie Coercible i przypisać sortowanie bieżącej bazy danych dla połączenia lub bazy danych, która zawiera zdefiniowane przez użytkownika funkcja, procedura składowanalub wyzwalacz, w której istnieje odwołanie RZUTOWANIA lub konwersji.
funkcje wbudowane zwraca ciąg , ale nie podejmują wprowadzania ciąg , w wyniku ciąg jest domyślnie Coercible i przypisano sortowanie bieżącej bazy danych lub sortowanie bazy danych, która zawiera zdefiniowane przez użytkownika funkcja, procedura składowanalub wyzwalacz, w której jest odwołanie do funkcja .
Następujące funkcje są sortowanie-wrażliwe i ich ciągów wyjściowych mają etykiety sortowanie ciągwejściowy:
CHARINDEX |
ZAMIEŃ |
RÓŻNICA |
ODWRÓĆ |
FUNKCJA ISNUMERIC |
W PRAWO |
W LEWO |
SOUNDEX |
LEN |
RZECZY |
LITMAŁE |
SUBSTRING |
PATINDEX |
LITWIELKIE |
Zobacz także