Precedência de ordenaçãoCollation Precedence

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simAzure Synapse Analytics (SQL DW) simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

A precedência de ordenação, também conhecida como regras de coerção de ordenação, determina o seguinte:Collation precedence, also known as collation coercion rules, determines the following:

  • A ordenação do resultado final de uma expressão que é avaliada como uma cadeia de caracteres.The collation of the final result of an expression that is evaluated to a character string.

  • 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.The collation that is used by collation-sensitive operators that use character string inputs but do not return a character string, such as LIKE and 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.The collation precedence rules apply only to the character string data types: char, varchar, text, nchar, nvarchar, and ntext. Os objetos que têm outros tipos de dados não participam de avaliações de ordenação.Objects that have other data types do not participate in collation evaluations.

Rótulos de ordenaçãoCollation Labels

A tabela a seguir lista e descreve as quatro categorias nas quais são identificadas as ordenações de todos os objetos.The following table lists and describes the four categories in which the collations of all objects are identified. O nome de cada categoria é chamado de rótulo de ordenação.The name of each category is called the collation label.

Rótulo de ordenaçãoCollation label Tipos de objetosTypes of objects
Padrão coercívelCoercible-default Qualquer variável de cadeia de caracteres Transact-SQLTransact-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.Any Transact-SQLTransact-SQL character string variable, parameter, literal, or the output of a catalog built-in function, or a built-in function that does not take string inputs but produces a string output.

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.If the object is declared in a user-defined function, stored procedure, or trigger, the object is assigned the default collation of the database in which the function, stored procedure, or trigger is created. 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.If the object is declared in a batch, the object is assigned the default collation of the current database for the connection.
X implícitoImplicit X Uma referência de coluna.A column reference. A ordenação da expressão (X) é obtida da ordenação definida para a coluna na tabela ou exibição.The collation of the expression (X) is taken from the collation defined for the column in the table or view.

Mesmo se foi atribuído explicitamente uma ordenação à coluna usando uma cláusula COLLATE na instrução CREATE TABLE ou CREATE VIEW, a referência da coluna será classificada como implícita.Even if the column was explicitly assigned a collation by using a COLLATE clause in the CREATE TABLE or CREATE VIEW statement, the column reference is classified as implicit.
X explícitoExplicit X Uma expressão que é convertida explicitamente em uma ordenação específica (X) usando uma cláusula COLLATE na expressão.An expression that is explicitly cast to a specific collation (X) by using a COLLATE clause in the expression.
Sem-agrupamentoNo-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.Indicates that the value of an expression is the result of an operation between two strings that have conflicting collations of the implicit collation label. O resultado da expressão é definido como não tendo uma ordenação.The expression result is defined as not having a collation.

Regras de ordenaçãoCollation Rules

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.The collation label of a simple expression that references only one character string object is the collation label of the referenced object.

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.The collation label of a complex expression that references two operand expressions with the same collation label is the collation label of the operand expressions.

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:The collation label of the final result of a complex expression that references two operand expressions with different collations is based on the following rules:

  • Explícito tem precedência sobre implícito.Explicit takes precedence over implicit. Implícito tem precedência sobre Padrão coercível:Implicit takes precedence over Coercible-default:

    Explícito > Implícito > Padrão coercívelExplicit > Implicit > Coercible-default

  • A combinação de duas expressões explícitas que receberam ordenações diferentes gera um erro:Combining two Explicit expressions that have been assigned different collations generates an error:

    X explícito + Y explícito = ErroExplicit X + Explicit Y = Error

  • A combinação de duas expressões implícitas que tenham ordenações diferentes gera um resultado Sem-ordenação:Combining two Implicit expressions that have different collations yields a result of No-collation:

    X implícito + Y implícito = Sem-agrupamentoImplicit X + Implicit Y = No-collation

  • 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:Combining an expression with No-collation with an expression of any label, except Explicit collation (see the following rule), yields a result that has the No-collation label:

    Sem-agrupamento + qualquer coisa = Sem-agrupamentoNo-collation + anything = No-collation

  • 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:Combining an expression with No-collation with an expression that has an Explicit collation, yields an expression with an Explicit label:

    Sem-agrupamento + X explícito = ExplícitoNo-collation + Explicit X = Explicit

A tabela a seguir resume as regras.The following table summarizes the rules.

Rótulo de coerção do operandoOperand coercion label X explícitoExplicit X X implícitoImplicit X Padrão coercívelCoercible-default Sem-agrupamentoNo-collation
Y explícitoExplicit Y Gera erroGenerates Error O resultado é Y explícitoResult is Explicit Y O resultado é Y explícitoResult is Explicit Y O resultado é Y explícitoResult is Explicit Y
Y implícitoImplicit Y O resultado é X explícitoResult is Explicit X O resultado é Sem-agrupamentoResult is No-collation O resultado é Y implícitoResult is Implicit Y O resultado é Sem-agrupamentoResult is No-collation
Coercible-defaultCoercible-default O resultado é X explícitoResult is Explicit X O resultado é X implícitoResult is Implicit X O resultado é Padrão coercívelResult is Coercible-default O resultado é Sem-agrupamentoResult is No-collation
Sem agrupamentoNo-collation O resultado é X explícitoResult is Explicit X O resultado é Sem-agrupamentoResult is No-collation O resultado é Sem-agrupamentoResult is No-collation O resultado é Sem-agrupamentoResult is No-collation

As regras adicionais a seguir também são aplicadas à precedência de ordenação:The following additional rules also apply to collation precedence:

  • Você não pode ter várias cláusulas COLLATE em uma expressão que já é uma expressão explícita.You cannot have multiple COLLATE clauses on an expression that is already an explicit expression. 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:For example, the following WHERE clause is not valid because a COLLATE clause is specified for an expression that is already an explicit expression:

    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.Code page conversions for text data types are not allowed. Você não pode converter uma expressão text de uma ordenação em outra se elas tiverem páginas de código diferentes.You cannot cast a text expression from one collation to another if they have the different code pages. 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.The assignment operator cannot assign values when the collation of the right text operand has a different code page than the left text operand.

A precedência de ordenação é determinada após a conversão de tipo de dados.Collation precedence is determined after data type conversion. 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.The operand from which the resulting collation is taken can be different from the operand that supplies the data type of the final result. Por exemplo, considere o seguinte lote:For example, consider the following batch:

CREATE TABLE TestTab  
   (PrimaryKey int PRIMARY KEY,  
    CharCol char(10) COLLATE French_CI_AS  
   )  
  
SELECT *  
FROM TestTab  
WHERE CharCol LIKE N'abc'  

O tipo de dados Unicode da expressão simples N'abc' tem uma precedência de tipo de dados mais alta.The Unicode data type of the simple expression N'abc' has a higher data type precedence. Portanto, a expressão resultante tem o tipo de dados Unicode atribuído a N'abc'.Therefore, the resulting expression has the Unicode data type assigned to 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.However, the expression CharCol has a collation label of Implicit, and N'abc' has a lower coercion label of Coercible-default. Assim, a ordenação usada será French_CI_AS de CharCol.Therefore, the collation that is used is the French_CI_AS collation of CharCol.

Exemplos de regras de ordenaçãoExamples of Collation Rules

Os exemplos a seguir mostram como funcionam as regras de ordenação.The following examples show how the collation rules work. Para executar os exemplos, crie a seguinte tabela de teste.To run the examples, create the following test table.

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 ordenaçãoCollation Conflict and Error

O predicado da consulta a seguir tem conflito de ordenação e gera um erro.The predicate in the following query has collation conflict and generates an error.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol;  

Aqui está o conjunto de resultados.Here is the result set.

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 x rótulo implícitoExplicit Label vs. Implicit Label

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.The predicate in the following query is evaluated in collation greek_ci_as because the right expression has the Explicit label. Isto tem precedência sobre o rótulo Implícito da expressão da esquerda.This takes precedence over the Implicit label of the left expression.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol COLLATE greek_ci_as;  

Aqui está o conjunto de resultados.Here is the result set.

id          GreekCol             LatinCol  
----------- -------------------- --------------------  
          1 A                    a  
  
(1 row affected)  

Rótulos sem-agrupamentoNo-Collation Labels

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.The CASE expressions in the following queries have a No-collation label; therefore, they cannot appear in the select list or be operated on by collation-sensitive operators. Entretanto, as expressões podem ser operadas por operadores que não diferenciem ordenações.However, the expressions can be operated on by collation-insensitive operators.

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

Aqui está o conjunto de resultados.Here is the result set.

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.Here is the result set.

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.Here is the result set.

--------------------  
a  
  
(1 row affected)  

Diferenciação de ordenações e sem diferenciação de ordenaçõesCollation Sensitive and Collation Insensitive

Os operadores e as funções diferenciam ou não ordenações.Operators and functions are either collation sensitive or insensitive.

Diferencia ordenaçãoCollation sensitive
Isto significa que a especificação de um operando Sem-agrupamento é um erro em tempo de compilação.This means that specifying a No-collation operand is a compile-time error. O resultado de expressão não pode ser Sem-agrupamento.The expression result cannot be No-collation.

Não diferencia ordenaçãoCollation insensitive
Isto significa que os operandos e o resultado podem ser Sem-agrupamento.This means that the operands and result can be No-collation.

Operadores e ordenaçãoOperators and Collation

Os operadores de comparação e os operadores MAX, MIN, BETWEEN, LIKE e IN diferenciam ordenações.The comparison operators, and the MAX, MIN, BETWEEN, LIKE, and IN operators, are collation sensitive. A cadeia de caracteres usada pelos operadores recebe o rótulo da ordenação do operando que tem a precedência mais alta.The string used by the operators is assigned the collation label of the operand that has the higher precedence. A instrução UNION também diferencia ordenações e todos os operandos de cadeias de caracteres. Além disso, a ordenação do operando com a precedência mais alta é atribuída ao resultado final.The UNION statement is also collation sensitive, and all string operands and the final result is assigned the collation of the operand with the highest precedence. A precedência de ordenação dos operandos UNION e do resultado é avaliada a cada coluna.The collation precedence of the UNION operand and result are evaluated column by column.

O operador de atribuição não diferencia ordenações e a expressão da direita é convertida na ordenação da esquerda.The assignment operator is collation insensitive and the right expression is cast to the left collation.

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.The string concatenation operator is collation sensitive, the two string operands and the result are assigned the collation label of the operand with the highest collation precedence. As instruções UNION ALL e CASE não diferenciam ordenações. Além disso, o rótulo da ordenação do operando com a precedência mais alta é atribuído a todos os operandos de cadeias de caracteres e aos resultados finais.The UNION ALL and CASE statements are collation insensitive, and all string operands and the final results are assigned the collation label of the operand with the highest precedence. A precedência de ordenação dos operandos UNION ALL e do resultado é avaliada a cada coluna.The collation precedence of the UNION ALL operands and result are evaluated column by column.

Funções e ordenaçãoFunctions and Collation

As funções CAST, CONVERT e COLLATE diferenciam ordenação para os tipos de dados char, varchar e text.THE CAST, CONVERT, and COLLATE functions are collation sensitive for char, varchar, and text data types. Se a entrada e a saída das funções CAST e CONVERT forem cadeias de caracteres, a cadeia de saída terá o rótulo de ordenação da cadeia de caracteres de entrada.If the input and output of the CAST and CONVERT functions are character strings, the output string has the collation label of the input string. Se a entrada não for uma cadeia de caracteres, a cadeia de saída será Padrão coercível e receberá a ordenação do banco de dados atual da 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 CAST ou CONVERT é referenciado.If the input is not a character string, the output string is Coercible-default and assigned the collation of the current database for the connection, or the database that contains the user-defined function, stored procedure, or trigger in which the CAST or CONVERT is referenced.

Para as funções internas que retornam uma cadeia de caracteres, mas não obtêm uma entrada de cadeia, a cadeia resultante será Padrão coercível e receberá a ordenação do banco de dados atual ou a 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.For the built-in functions that return a string but do not take a string input, the result string is Coercible-default and is assigned either the collation of the current database, or the collation of the database that contains the user-defined function, stored procedure, or trigger in which the function is referenced.

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:The following functions are collation-sensitive and their output strings have the collation label of the input string:

CHARINDEXCHARINDEX REPLACEREPLACE
DIFFERENCEDIFFERENCE REVERSEREVERSE
ISNUMERICISNUMERIC RIGHTRIGHT
LEFTLEFT SOUNDEXSOUNDEX
LENLEN STUFFSTUFF
LOWERLOWER SUBSTRINGSUBSTRING
PATINDEXPATINDEX UPPERUPPER

Consulte TambémSee Also

COLLATE (Transact-SQL) COLLATE (Transact-SQL)
Conversão de tipo de dados (Mecanismo de Banco de Dados) Data Type Conversion (Database Engine)
Operadores (Transact-SQL) Operators (Transact-SQL)
Expressões (Transact-SQL)Expressions (Transact-SQL)