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 |
See Also