Compartilhar via


Precedência de ordenação

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Ponto de extremidade de análise de SQL no Microsoft FabricDepósito no Microsoft FabricBanco de dados SQL no Microsoft Fabric

A precedência de agrupamento, também conhecida como regras de coerção de agrupamento, determina os dois resultados a seguir:

  • A ordenação do resultado final de uma expressão que é avaliada como uma cadeia de caracteres.

  • A ordenação usada por operadores sensíveis à ordenação que usam entradas de cadeia de caracteres, mas não retornam uma cadeia de caracteres, como LIKE e IN.

As regras de precedência de ordenação se aplicam somente a tipos de dados de cadeia de caracteres: char, varchar, text, nchar, nvarchar e ntext. Objetos que têm outros tipos de dados não participam de avaliações de ordenação.

Rótulos de agrupamento

A tabela a seguir lista e descreve as quatro categorias nas quais são identificadas as ordenações de todos os objetos. O nome de cada categoria é o rótulo de ordenação.

Rótulo de ordenação Tipos de objetos
Coercible-default Qualquer Transact-SQL variável de cadeia de caracteres, parâmetro, literal ou a saída de uma função interna de catálogo ou uma função interna que não aceita entradas de cadeia de caracteres, mas produz uma saída de cadeia de caracteres.

Se o objeto for declarado em uma função definida pelo usuário, procedimento armazenado ou gatilho, ao objeto será atribuída a ordenação padrão do banco de dados no qual a função, o procedimento armazenado ou o gatilho for criado. Se o objeto for declarado em um lote, ao objeto será atribuída a ordenação padrão do banco de dados atual da conexão.
Implicit X Uma referência de coluna. A ordenação da expressão (X) é obtida da ordenação definida para a coluna na tabela ou exibição.

Mesmo que a coluna tenha sido explicitamente atribuída a uma ordenação usando uma COLLATE cláusula na instrução orCREATE TABLE, a CREATE VIEW referência de coluna será classificada como implícita.
Explicit X Uma expressão que é explicitamente convertida em uma ordenação específica (X) usando uma COLLATE cláusula na expressão.
No-collation Indica que o valor de uma expressão é o resultado de uma operação entre duas cadeias de caracteres que têm ordenações conflitantes do rótulo de ordenação implícito. O resultado da expressão é definido como não tendo uma ordenação.

Regras de ordenação

O rótulo de ordenação de uma expressão simples que faça referência a somente um objeto de cadeia de caracteres é o rótulo de ordenação do objeto referenciado.

O rótulo de ordenação de uma expressão complexa que faça referência a duas expressões de operando com o mesmo rótulo de ordenação é o rótulo de ordenação das expressões de operando.

O rótulo de ordenação do resultado final de uma expressão complexa que faça referência a duas expressões de operando com ordenações diferentes tem como base as seguintes regras:

  • Explícito tem precedência sobre implícito. Implícito tem precedência sobre Padrão coercível:

    Explícito > Implícito > Padrão coercível

  • A combinação de duas expressões explícitas que receberam ordenações diferentes gera um erro:

    X explícito + Y explícito = Erro

  • A combinação de duas expressões implícitas que tenham ordenações diferentes gera um resultado Sem-ordenação:

    X implícito + Y implícito = Sem-agrupamento

  • A combinação de uma expressão Sem-ordenação com uma expressão de qualquer rótulo, exceto ordenação Explícita (consulte a regra seguinte), gera um resultado que tem o rótulo Sem-ordenação:

    Sem-agrupamento + qualquer coisa = Sem-agrupamento

  • A combinação de uma expressão Sem-ordenação com uma expressão que tenha uma ordenação Explícita, gera uma expressão com um rótulo Explícito:

    Sem-agrupamento + X explícito = Explícito

A tabela a seguir resume as regras.

Rótulo de coerção do operando X explícito X implícito Padrão coercível Sem-agrupamento
Explicit Y Gera erro O resultado é Y explícito O resultado é Y explícito O resultado é Y explícito
Implicit Y O resultado é X explícito O resultado é Sem-agrupamento O resultado é Y implícito O resultado é Sem-agrupamento
Coercible-default O resultado é X explícito O resultado é X implícito O resultado é Padrão coercível O resultado é Sem-agrupamento
No-collation O resultado é X explícito O resultado é Sem-agrupamento O resultado é Sem-agrupamento O resultado é Sem-agrupamento

As regras adicionais a seguir também são aplicadas à precedência de ordenação:

  • Você não pode ter várias COLLATE cláusulas em uma expressão que já seja uma expressão explícita. Por exemplo, a cláusula a seguir WHERE não é válida porque uma COLLATE cláusula é especificada para uma expressão que já é uma expressão explícita:

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

  • Conversões de página de código para tipos de dados de texto não são permitidas. Você não poderá converter uma expressão de texto de uma ordenação para outra se elas tiverem as diferentes páginas de código. O operador de atribuição não pode atribuir valores quando a ordenação do operando de texto à direita tem uma página de código diferente do operando de texto esquerdo.

A precedência de ordenação é determinada após a conversão de tipo de dados. O operando a partir do qual a ordenação resultante é obtida pode ser diferente do operando que fornece o tipo de dados do resultado final. Por exemplo, considere o seguinte lote:

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

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

Observação

Não há suporte para o tipo de dados nvarchar no Fabric Warehouse, mas a maioria dos exemplos neste artigo é aplicável ao varchar usando UTF-8 e nvarchar e, portanto, permanecem aplicáveis ao Fabric Warehouse, a menos que indicado de outra forma.

O tipo de dados Unicode da expressão simples N'abc' tem uma precedência de tipo de dados mais alta. Portanto, a expressão resultante tem o tipo de dados Unicode atribuído a N'abc'. Entretanto, a expressão CharCol tem um rótulo de ordenação Implícito e N'abc' tem um rótulo de coerção inferior, Padrão coercível. Assim, a ordenação usada será French_CI_AS de CharCol.

Exemplos de regras de ordenação

Os exemplos a seguir mostram como funcionam as regras de ordenação. Para executar os exemplos, crie a seguinte tabela de teste.

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

Conflito e erro de agrupamento

O predicado da consulta a seguir tem conflito de ordenação e gera um erro.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;

Veja a seguir o conjunto de resultados.

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.

Rótulo explícito vs. rótulo implícito

O predicado na consulta a seguir é avaliado na ordenação greek_ci_as porque a expressão da direita tem o rótulo Explícito. Isto tem precedência sobre o rótulo Implícito da expressão da esquerda.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

Veja a seguir o conjunto de resultados.

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

Rótulos sem agrupamento

Observação

Devido à diferença entre o comportamento de nvarchar e varchar em uma ordenação UTF-8, este exemplo não se aplica ao Fabric Warehouse.

As CASE expressões nas consultas a seguir têm um rótulo sem ordenação; portanto, elas não podem aparecer na lista de seleção ou ser operadas por operadores sensíveis à ordenação. Entretanto, as expressões podem ser operadas por operadores que não diferenciem ordenações.

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

Veja a seguir o conjunto de resultados.

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;

Veja a seguir o conjunto de resultados.

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;

Veja a seguir o conjunto de resultados.

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

Diferencia ordenação e não diferencia ordenação

Os operadores e as funções diferenciam ou não ordenações.

  • Diferencia ordenação: isso significa que especificar um operando sem ordenação é um erro em tempo de compilação. O resultado da expressão não pode ser Não ordenação.
  • Agrupamento insensível: Isso significa que os operandos e o resultado podem ser Sem agrupamento.

Operadores e agrupamento

Os operadores de comparação e os MAXoperadores , MIN, BETWEEN, LIKE, e IN são sensíveis à ordenação. A cadeia de caracteres usada pelos operadores recebe o rótulo da ordenação do operando que tem a precedência mais alta. A UNION instrução também diferencia ordenação e todos os operandos de cadeia de caracteres e o resultado final recebem a ordenação do operando com a precedência mais alta. A precedência de agrupamento do operando e do UNION resultado são avaliadas coluna por coluna.

O operador de atribuição não diferencia ordenações e a expressão da direita é convertida na ordenação da esquerda.

O operador de concatenação de cadeias de caracteres não diferencia ordenações, e os dois operandos de cadeias de caracteres e o resultado recebem o rótulo de ordenação do operando com a precedência de ordenação mais alta. As UNION ALL instruções and CASE não diferenciam ordenamentos, e todos os operandos de cadeia de caracteres e os resultados finais recebem o rótulo de agrupamento do operando com a precedência mais alta. A precedência de agrupamento dos operandos e o UNION ALL resultado são avaliados coluna por coluna.

Funções e ordenação

As CASTfunções e CONVERT as COLLATEfunções diferenciam a ordenação para tipos de dados char, varchar e text. Se a entrada e a CAST saída das funções and CONVERT forem cadeias de caracteres, a cadeia de caracteres de saída terá o rótulo de agrupamento da cadeia de caracteres de entrada. Se a entrada não for uma cadeia de caracteres, a cadeia de caracteres de saída será coercível-padrão e atribuiu a ordenação do banco de dados atual para a conexão ou o banco de dados que contém a função definida pelo usuário, o procedimento armazenado ou o gatilho no qual o CAST ou CONVERT é referenciado.

Para as funções internas que retornam uma cadeia de caracteres, mas não levam uma entrada de cadeia de caracteres, a cadeia de caracteres de resultado é coercível-padrão. A cadeia de caracteres de resultado é atribuída à ordenação do banco de dados atual ou à ordenação do banco de dados que contém a função definida pelo usuário, o procedimento armazenado ou o gatilho no qual a função é referenciada.

As funções a seguir diferenciam ordenações e suas cadeias de saída têm o rótulo de ordenação da cadeia de caracteres de entrada:

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