Precedência de ordenação

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse 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 pelos operadores que diferenciam ordenações e 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. Os 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 é chamado de rótulo de ordenação.

Rótulo de ordenação Tipos de objetos
Coercible-default Qualquer variável de cadeia de caracteres Transact-SQL, parâmetro, literal ou a saída de uma função interna de catálogo, ou uma função interna que não obtenha entradas de cadeia de caracteres, mas produza 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 VIEW, a CREATE TABLE referência de coluna será classificada como implícita.
Explicit X Uma expressão que é convertida explicitamente em uma ordenação específica (X) usando uma cláusula COLLATE 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 cláusulas COLLATE em uma expressão que já é uma expressão explícita. Por exemplo, a seguinte cláusula WHERE não é válida porque uma cláusula COLLATE foi especificada para uma expressão que já é uma expressão explícita:

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

  • Não são permitidas conversões de página de código em tipos de dados text. Você não pode converter uma expressão text de uma ordenação em outra se elas tiverem páginas de código diferentes. O operador de atribuição não pode atribuir valores quando a ordenação do operando de texto da direita tiver uma página de código diferente que a do operando de texto da esquerda.

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

O tipo de dados nvarchar não é suportado no Fabric Warehouse, mas a maioria dos exemplos neste artigo é aplicável a varchar usando UTF-8 e nvarchar e, portanto, permanece aplicável ao Fabric Warehouse, salvo indicação em contrário.

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

Rótulos sem agrupamento

Observação

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

As expressões CASE das consultas a seguir têm um rótulo Sem-ordenação; portanto, não podem aparecer na lista de seleção ou serem operadas por operadores que diferenciam ordenações. 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  
  
(1 row affected)  

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 de expressão não pode ser Sem-agrupamento.
  • 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 funções , CONVERTCAST, e COLLATE diferenciam ordenação para os 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á padrão coercível e atribuída ao agrupamento do banco de dados atual para a conexão ou ao banco de dados que contém a função definida pelo usuário, o procedimento armazenado ou o gatilho no qual o CAST or CONVERT é referenciado.

Para as funções internas que retornam uma cadeia de caracteres, mas não usam uma entrada de cadeia de caracteres, a cadeia de caracteres resultante é Coercible-default. 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

REPLACE

DIFFERENCE

REVERSE

ISNUMERIC

RIGHT

LEFT

SOUNDEX

LEN

STUFF

LOWER

SUBSTRING

PATINDEX

UPPER