Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base 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
LIKEe 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
COLLATEcláusulas em uma expressão que já é uma expressão explícita. Por exemplo, a cláusula a seguirWHEREnão é válida porque umaCOLLATEcláusula é especificada para uma expressão que já é uma expressão explícita:WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_ASConversõ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:
CHARINDEXDIFFERENCEISNUMERICLEFTLENLOWERPATINDEXREPLACEREVERSERIGHTSOUNDEXSTUFFSUBSTRINGUPPER