Precedência do agrupamento

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

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

  • O agrupamento do resultado final de uma expressão que é avaliada para uma cadeia de caracteres.

  • O agrupamento que é usado por operadores sensíveis ao agrupamento 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 agrupamento aplicam-se apenas aos 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 agrupamento.

Etiquetas de agrupamento

A tabela a seguir lista e descreve as quatro categorias nas quais os agrupamentos de todos os objetos são identificados. O nome de cada categoria é o rótulo de agrupamento.

Rótulo de agrupamento 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 recebe entradas de cadeia de caracteres, mas produz uma saída de cadeia de caracteres.

Se o objeto for declarado em uma função, procedimento armazenado ou gatilho definido pelo usuário, o objeto receberá o agrupamento padrão do banco de dados no qual a função, o procedimento armazenado ou o gatilho serão criados. Se o objeto for declarado em um lote, o objeto receberá o agrupamento padrão do banco de dados atual para a conexão.
Implicit X Uma referência de coluna. O agrupamento da expressão (X) é retirado do agrupamento definido para a coluna na tabela ou exibição.

Mesmo que a coluna tenha sido explicitamente atribuída a um agrupamento usando uma COLLATE cláusula na instrução orCREATE TABLE, a CREATE VIEW referência da coluna é classificada como implícita.
Explicit X Uma expressão que é explicitamente convertida para um agrupamento específico (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 agrupamentos conflitantes do rótulo de agrupamento implícito. O resultado da expressão é definido como não ter um agrupamento.

Regras de agrupamento

O rótulo de agrupamento de uma expressão simples que faz referência a apenas um objeto de cadeia de caracteres é o rótulo de agrupamento do objeto referenciado.

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

O rótulo de agrupamento do resultado final de uma expressão complexa que faz referência a duas expressões de operando com agrupamentos diferentes baseia-se nas seguintes regras:

  • O explícito tem precedência sobre o implícito. O implícito tem precedência sobre o padrão coercitivo:

    Explícito > Implícito > Coercible-default

  • A combinação de duas expressões explícitas que foram atribuídas agrupamentos diferentes gera um erro:

    Explícito X + Explícito Y = Erro

  • A combinação de duas expressões implícitas que têm agrupamentos diferentes produz um resultado de No-collation:

    Implícito X + Implícito Y = Não-agrupamento

  • A combinação de uma expressão com No-collation com uma expressão de qualquer rótulo, exceto Agrupamento explícito (consulte a regra a seguir), produz um resultado que tem o rótulo No-collation:

    Sem colação + qualquer coisa = Sem colação

  • A combinação de uma expressão com No-collation com uma expressão que tem um agrupamento Explícito, produz uma expressão com um rótulo Explícito:

    Não-agrupamento + Explícito X = Explícito

A tabela a seguir resume as regras.

Rótulo de coerção de operação X explícito X implícito Incumprimento coercível Não-agrupamento
Explicit Y Gera erro O resultado é Y explícito O resultado é Y explícito O resultado é Y explícito
Implicit Y O resultado é Explícito X O resultado é No-collation O resultado está implícito Y O resultado é No-collation
Coercible-default O resultado é Explícito X O resultado está implícito X O resultado é Coercible-default O resultado é No-collation
No-collation O resultado é Explícito X O resultado é No-collation O resultado é No-collation O resultado é No-collation

As seguintes regras adicionais também se aplicam à precedência da colação:

  • Não é possível ter várias COLLATE cláusulas em uma expressão que já é 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. Não é possível converter uma expressão de texto de um agrupamento para outro se eles tiverem as diferentes páginas de código. O operador de atribuição não pode atribuir valores quando o agrupamento do operando de texto direito tem uma página de código diferente do operando de texto esquerdo.

A precedência do agrupamento é determinada após a conversão do tipo de dados. O operando do qual o agrupamento resultante é obtido 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 N'abc' simples 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'. No entanto, a expressão CharCol tem um rótulo de agrupamento de Implícito, e N'abc' tem um rótulo de coerção inferior de Coercível-padrão. Portanto, o agrupamento que é usado é o French_CI_AS agrupamento de CharCol.

Exemplos de regras de agrupamento

Os exemplos a seguir mostram como as regras de agrupamento funcionam. Para executar os exemplos, crie a tabela de teste a seguir.

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 na consulta a seguir tem conflito de agrupamento e gera um erro.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;

Aqui está 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 no agrupamento greek_ci_as porque a expressão correta tem o rótulo Explícito. Isso tem precedência sobre o rótulo implícito da expressão de esquerda.

SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;

Aqui está 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 um agrupamento UTF-8, este exemplo não se aplica no Fabric Warehouse.

As CASE expressões nas consultas a seguir têm um rótulo No-collation, portanto, elas não podem aparecer na lista de seleção ou ser operadas por operadores sensíveis ao agrupamento. No entanto, as expressões podem ser operadas por operadores que não diferenciam o agrupamento.

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

Aqui está 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;

Aqui está 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;

Aqui está o conjunto de resultados.

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

Agrupamento sensível e agrupamento insensível

Operadores e funções são sensíveis ao agrupamento ou insensíveis.

  • Sensível ao agrupamento: Isso significa que especificar um operando sem agrupamento é um erro em tempo de compilação. O resultado da expressão não pode ser No-collation.
  • Agrupamento insensível: Isso significa que os operandos e o resultado podem ser No-collation.

Operadores e agrupamento

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

O operador de atribuição é insensível ao agrupamento e a expressão direita é convertida para o agrupamento esquerdo.

O operador de concatenação de cadeia de caracteres é sensível ao agrupamento, os dois operandos de cadeia de caracteres e o resultado recebem o rótulo de agrupamento do operando com a maior precedência de agrupamento. As UNION ALL instruções e CASE são insensíveis ao agrupamento e todos os operandos de cadeia de caracteres e os resultados finais recebem o rótulo de agrupamento do operando com a maior precedência. A precedência de agrupamento dos operandos e o UNION ALL resultado são avaliados coluna por coluna.

Funções e agrupamento

As CASTfunções , CONVERTe são COLLATE sensíveis ao agrupamento para os tipos de dados char, varchar e text . Se a entrada e a CAST saída das funções e 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á Coercible-default e atribuiu o agrupamento 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 aceitam uma entrada de cadeia de caracteres, a cadeia de caracteres de resultado é Coercible-default. A cadeia de caracteres de resultado é atribuída ao agrupamento do banco de dados atual ou ao agrupamento 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 seguintes funções são sensíveis ao agrupamento e suas cadeias de caracteres de saída têm o rótulo de agrupamento da cadeia de entrada:

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