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

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

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

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

  • Параметры сортировки, используемые теми операторами с учетом параметров сортировки, которые принимают в качестве параметра символьную строку, но не возвращают ее, например операторы LIKE и 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

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

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

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  
  
(1 row affected)  

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

Примечание.

Из-за разницы между поведением 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  
  
(1 row affected)  

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

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

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

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

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

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

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

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

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

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

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

CHARINDEX

REPLACE

DIFFERENCE

REVERSE

ISNUMERIC

RIGHT

LEFT

SOUNDEX

LEN

STUFF

LOWER

SUBSTRING

PATINDEX

UPPER