Очередность параметров сортировки (Transact-SQL)

Очередность параметров сортировки, также называемая правилами приведения параметров сортировки, определяет следующее.

  • Параметры сортировки итоговых результатов выражения, возвращающего символьную строку.

  • Параметры сортировки, используемые теми операторами с учетом параметров сортировки, которые принимают в качестве параметра символьную строку, но не возвращают ее, например операторы LIKE и IN.

Правила очередности параметров сортировки распространяются только на типы данных символьных строк: char, varchar, text, nchar, nvarchar и ntext. Объекты, содержащие данные других типов, не принимают участия в оценке параметров сортировки.

Метки параметров сортировки

В следующей таблице перечислены и описаны четыре категории, в которых обозначены параметры сортировки для всех объектов. Имя каждой категории также называется меткой параметров сортировки.

Метка параметров сортировки

Типы объектов

Приводимые по умолчанию

Любая переменная типа символьной строки языка Transact-SQL, параметр, литерал, выходное значение каталога встроенной функции или встроенная функция несимвольного аргумента, выходом которой является строка.

Если объект объявлен внутри пользовательской функции, хранимой процедуры или триггера, то ему присваиваются параметры сортировки по умолчанию, принятые для базы данных, в которой указанная функция, хранимая процедура или триггер были созданы. Если объект объявлен внутри пакета, то ему присваиваются параметры сортировки по умолчанию, принятые для текущей базы данных для этого соединения.

Неявные X

Ссылка на столбец. Параметры сортировки для выражения (X) принимаются как параметры сортировки, определенные для столбцов таблицы или представления.

Даже в том случае, когда параметры сортировки для столбца были явно заданы с помощью предложения COLLATE в инструкции CREATE TABLE или CREATE VIEW, ссылка на столбец рассматривается как неявная.

Явные X

Выражение, которое явно приводится к указанным параметрам сортировки (X) с помощью предложения COLLATE в выражении.

Без параметров сортировки

Показывает, что значением выражения являются результаты операции над двумя строками с несовместимыми параметрами сортировки неявных меток параметров сортировки. Результат выражения определяется как не имеющий параметров сортировки.

Правила параметров сортировки

Меткой параметров сортировки простого выражения, ссылающегося на объект только одной символьной строки, является метка параметров сортировки этого объекта.

Меткой параметров сортировки сложного выражения, ссылающегося на выражения с двумя операндами с одинаковой меткой параметров сортировки, является метка этих выражений операндов.

Метка параметров сортировки для результата выполнения сложного выражения, ссылающегося на выражения с двумя операндами с разными метками параметров сортировки, основана на следующих правилах.

  • Явно указанные имеют приоритет над указанными неявно. Неявно указанные имеют приоритет над приводимыми по умолчанию:

    Явные > Неявные > Приводимые по умолчанию

  • Объединение двух выражений, имеющих разные явно указанные параметры сортировки, приведет к ошибке:

    Явные X + Явные Y = Ошибка

  • Объединение двух выражений, имеющих разные неявно указанные параметры сортировки, приведет к результату без параметров сортировки:

    Неявные X + Неявные Y = без параметров сортировки

  • Объединение выражения без параметров сортировки и выражения с любой меткой, кроме метки явно указанных параметров сортировки (см. следующее правило), приведет к результату с меткой без параметров сортировки:

    Без параметров сортировки + любое = без параметров сортировки

  • Объединение выражения без параметров сортировки и выражения с меткой явно указанных параметров сортировки приведет к результату с меткой явно указанных параметров сортировки:

    Без параметров сортировки + Явные X = Явные

Следующая таблица содержит сводку возможных значений.

Метка приведения операнда

Явные X

Неявные X

Приводимый по умолчанию

Без параметров сортировки

Явные Y

Ошибка

Результат — «Явные Y»

Результат — «Явные Y»

Результат — «Явные Y»

Неявные Y

Результат — «Явные X»

Результат — «Без параметров сортировки»

Результат — «Неявные Y»

Результат — «Без параметров сортировки»

Приводимые по умолчанию

Результат — «Явные X»

Результат — «Неявные X»

Результат — «Приводимые по умолчанию»

Результат — «Без параметров сортировки»

Без параметров сортировки

Результат — «Явные X»

Результат — «Без параметров сортировки»

Результат — «Без параметров сортировки»

Результат — «Без параметров сортировки»

Очередность параметров сортировки также подчиняется следующим дополнительным правилам.

  • Нельзя указать несколько предложений COLLATE для выражения с явно заданным параметром сортировки. Например, следующее предложение WHERE недопустимо, так как для выражения с уже явно указанным параметром сортировки применяется предложение COLLATE:

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

  • Невозможно преобразование кодовой страницы для данных типа text. Выражения типа text нельзя приводить из одних параметров сортировки в другие, если они имеют различные кодовые страницы. Нельзя пользоваться оператором присвоения для двух текстовых операндов, имеющих различные кодовые страницы в параметрах сортировки.

Очередность параметров сортировки определяется после преобразования типов данных. Параметры сортировки конечного результата могут быть от одного операнда, а тип конечного результата — от другого. Например, рассмотрим следующий пакет:

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

SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc'

Тип данных Юникода для простого выражения N'abc' имеет более высокую очередность. Поэтому результирующее выражение имеет тип данных Юникода, присвоенный строке N'abc'. Однако для выражения CharCol задана метка Implicit (неявные параметры сортировки), а для выражения N'abc' — метка Coercible-default (приводимые параметры сортировки по умолчанию) с более низкой очередностью. Поэтому применяются параметры сортировки French_CI_AS, заданные для CharCol.

Примеры правил параметров сортировки

В приведенных ниже примерах поясняется работа правил параметров сортировки. Чтобы запустить примеры, создайте следующую тестовую таблицу.

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

Конфликты и ошибки параметров сортировки

Предикат в приведенном ниже запросе приводит к конфликту параметров сортировки и вызывает ошибку.

SELECT * 
FROM TestTab 
WHERE GreekCol = LatinCol;

Ниже приводится результирующий набор.

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.

Сравнение меток «Явный» и «Неявный»

Предикату в приведенном ниже запросе назначаются параметры сортировки greek_ci_as, так как выражение справа имеет метку «Явный». Указанная метка имеет более высокую очередность, чем метка «Неявный» выражения слева.

SELECT * 
FROM TestTab 
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

Ниже приводится результирующий набор.

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

(1 row affected)

Метка «Без параметров сортировки»

Выражениям CASE приведенных ниже запросов присвоена метка «Без параметров сортировки», поэтому они не могут отображаться в списке выбора или обрабатываться операторами с учетом параметров сортировки. Подобные выражения могут обрабатываться операторами без учета параметров сортировки.

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

Ниже приводится результирующий набор.

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;

Ниже приводится результирующий набор.

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;

Ниже приводится результирующий набор.

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

(1 row affected)

С учетом параметров сортировки или без учета параметров сортировки

Операторы и функции могут быть с учетом параметров сортировки и без учета.

  • С учетом параметров сортировки
    Это означает, что указание операнда «Без параметров сортировки» вызывает ошибку при компиляции. Результат выражения не может быть «Без параметров сортировки».

  • Без учета параметров сортировки
    Это означает, что операнд и результат могут быть «Без параметров сортировки».

Операторы и параметры сортировки

Операторы сравнения и операторы MAX, MIN, BETWEEN, LIKE, IN выполняются с учетом параметров сортировки. Строке, используемой операторами, присваивается метка параметров сортировки операнда с более высокой очередностью. Оператор UNION также выполняется с учетом параметров сортировки, а строковым операндам и конечному результату присваивается метка параметров сортировки наивысшей очередности. Очередность параметров сортировки операндов и результатов UNION вычисляется по столбцам.

Оператор присвоения выполняется без учета параметров сортировки, так как выражение справа приводится к параметрам сортировки выражения слева.

Оператор объединения строк выполняется без учета параметров сортировки, а обоим строковым операндам и конечному результату присваивается метка параметров сортировки наивысшей очередности. Операторы UNION ALL и CASE выполняются без учета параметров сортировки, а всем строковым операндам и конечному результату присваивается метка параметров сортировки наивысшей очередности. Очередность параметров сортировки операндов и результатов UNION ALL вычисляется по столбцам.

Функции и параметры сортировки

Функции CAST, CONVERT и COLLATE учитывают параметры сортировки при работе с данными типа char, varchar и text. Если входными и выходными значениями функций CAST и CONVERT являются символьные строки, то выходной строке присваивается метка параметров сортировки входной строки. Если входное значение не является символьной строкой, то выходная строка имеет метку «Приведение по умолчанию», и ей присваиваются параметры сортировки текущей базы данных для этого соединения или базы данных, содержащей пользовательскую функцию, хранимую процедуру или триггер, из которых производится вызов функции CAST или CONVERT.

Для встроенных функций несимвольных аргументов, возвращающих строковые переменные, выходная строка имеет метку «Приведение по умолчанию» и ей присваиваются параметры сортировки текущей базы данных или параметры сортировки базы данных, содержащей пользовательскую функцию, хранимую процедуру или триггер, из которых производится вызов данной функции.

Ниже представлены функции, работающие с учетом параметров сортировки, у которых выходным строкам присваивается метка параметров сортировки входной строки.

CHARINDEX

REPLACE

DIFFERENCE

REVERSE

ISNUMERIC

RIGHT

LEFT

SOUNDEX

LEN

STUFF

LOWER

SUBSTRING

PATINDEX

UPPER