Поделиться через


Приоритет сортировки

Применимо к:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLAzure Synapse AnalyticsСистема платформы аналитики (PDW)Конечная точка SQL аналитики в Microsoft FabricХранилище в Microsoft FabricБаза данных SQL в Microsoft Fabric

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

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

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

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

Метки сортировки

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

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

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

Даже если столбец был явно назначен параметры сортировки с помощью COLLATE предложения в CREATE TABLE инструкции или CREATE VIEW инструкции, ссылка на столбец классифицируется как неявная.
Explicit X Выражение, которое явно приведение к определенному параметров сортировки (X) с помощью COLLATE предложения в выражении.
No-collation Показывает, что значением выражения являются результаты операции над двумя строками с несовместимыми параметрами сортировки неявных меток параметров сортировки. Результат выражения определяется как не имеющий параметров сортировки.

Правила сортировки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Метка приведения операнда Явные X Неявные X Приводимые по умолчанию Без параметров сортировки
Explicit Y Ошибка Результат — «Явные Y» Результат — «Явные Y» Результат — «Явные Y»
Implicit Y Результат — «Явные X» Результат — «Без параметров сортировки» Результат — «Неявные Y» Результат — «Без параметров сортировки»
Coercible-default Результат — «Явные X» Результат — «Неявные X» Результат — «Приводимые по умолчанию» Результат — «Без параметров сортировки»
No-collation Результат — «Явные X» Результат — «Без параметров сортировки» Результат — «Без параметров сортировки» Результат — «Без параметров сортировки»

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

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

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

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

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

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

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

Примечание.

Тип данных nvarchar не поддерживается в хранилище Fabric, но большинство примеров в этой статье применимы как к varchar с помощью UTF-8, так и nvarchar, и поэтому остаются применимыми к хранилищу Fabric, если не указано иное.

Тип данных Юникода для простого выражения 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

Метки без сортировки

Примечание.

Из-за разницы между поведением nvarchar и varchar в параметров сортировки UTF-8 этот пример не применяется в хранилище Fabric.

Выражения 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

Конфиденциальное параметры сортировки и не учитывает параметры сортировки

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

  • Конфиденциальное параметры сортировки. Это означает, что указание операнда без сортировки является ошибкой во время компиляции. Результат выражения не может быть параметров сортировки без сортировки.
  • Параметров сортировки не учитывается: это означает, что операнды и результат могут быть без параметров сортировки.

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

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

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

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

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

Параметры CASTсортировки CONVERTCOLLATE и функции чувствительны к параметрам сортировки для типов данных char, varchar и текстовых данных. Если входные и выходные данные CASTCONVERT и функции являются символьными строками, выходная строка имеет метку сортировки входной строки. Если входные данные не являются символьной строкой, выходная строка является Coercible-default и назначает параметры сортировки текущей базы данных для подключения, или базу данных, содержащую определяемую пользователем функцию, хранимую процедуру или триггер, в которой CAST ссылается или CONVERT имеет ссылку.

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

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

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