Prioridad de intercalaciónCollation Precedence

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

La prioridad de intercalación, o reglas de coerción de intercalación, determina lo siguiente:Collation precedence, also known as collation coercion rules, determines the following:

  • La intercalación del resultado final de una expresión que se evalúa como cadena de caracteres.The collation of the final result of an expression that is evaluated to a character string.

  • La intercalación utilizada por los operadores que distinguen la intercalación y que utilizan entradas de cadenas de caracteres pero no devuelven una cadena 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.

Las reglas de prioridad de intercalación solo se aplican a los tipos de datos de cadena de caracteres: char, varchar, text, nchar, nvarchar y ntext.The collation precedence rules apply only to the character string data types: char, varchar, text, nchar, nvarchar, and ntext. Los objetos con otros tipos de datos no participan en las evaluaciones de intercalación.Objects that have other data types do not participate in collation evaluations.

Etiquetas de intercalaciónCollation Labels

En la tabla siguiente se enumeran y describen las cuatro categorías en las que se identifican las intercalaciones de todos los objetos.The following table lists and describes the four categories in which the collations of all objects are identified. El nombre de cada categoría se denomina etiqueta de intercalación.The name of each category is called the collation label.

Etiqueta de intercalaciónCollation label Tipos de objetosTypes of objects
Coercible-defaultCoercible-default Cualquier variable, parámetro o valor literal de cadena de caracteres Transact-SQLTransact-SQL, o la salida de una función de catálogo integrada, o una función integrada que no utiliza entradas de cadena, pero genera una salida de cadena.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.

Si el objeto se declara en una función definida por el usuario, procedimiento almacenado o desencadenador, se le asigna la intercalación predeterminada de la base de datos en la que se crea la función, el procedimiento almacenado o el desencadenador.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. Si el objeto se declara en un lote, se le asigna la intercalación predeterminada de la base de datos actual para la conexión.If the object is declared in a batch, the object is assigned the default collation of the current database for the connection.
Implicit XImplicit X Referencia de columna.A column reference. La intercalación de la expresión (X) se obtiene de la intercalación definida para la columna en la tabla o vista.The collation of the expression (X) is taken from the collation defined for the column in the table or view.

Aunque se haya asignado una intercalación a la columna explícitamente mediante una cláusula COLLATE en la instrucción CREATE TABLE o CREATE VIEW, la referencia de columna se clasifica 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.
Explicit XExplicit X Expresión que se convierte explícitamente a una intercalación específica (X) utilizando una cláusula COLLATE en la expresión.An expression that is explicitly cast to a specific collation (X) by using a COLLATE clause in the expression.
No-collationNo-collation Indica que el valor de una expresión es el resultado de una operación entre dos cadenas que tienen intercalaciones incompatibles de la etiqueta de intercalación implícita.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. El resultado de la expresión se define como carente de intercalación.The expression result is defined as not having a collation.

Reglas de intercalaciónCollation Rules

La etiqueta de intercalación de una expresión simple que hace referencia a un único objeto de cadena de caracteres es la etiqueta de intercalación del objeto al que se hace referencia.The collation label of a simple expression that references only one character string object is the collation label of the referenced object.

La etiqueta de intercalación de una expresión compleja que hace referencia a dos expresiones de operando con la misma etiqueta de intercalación es la etiqueta de intercalación de las expresiones 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.

La etiqueta de intercalación del resultado final de una expresión compleja que hace referencia a dos expresiones de operando con distintas intercalaciones se basa en las reglas siguientes: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:

  • Explicit tiene prioridad sobre Implicit.Explicit takes precedence over implicit. Implicit tiene prioridad sobre Coercible-default:Implicit takes precedence over Coercible-default:

    Explicit > Implicit > Coercible-defaultExplicit > Implicit > Coercible-default

  • La combinación de dos expresiones Explicit a las que se han asignado intercalaciones distintas genera un error:Combining two Explicit expressions that have been assigned different collations generates an error:

    Explicit X + Explicit Y = ErrorExplicit X + Explicit Y = Error

  • La combinación de dos expresiones Implicit que tienen intercalaciones distintas genera el resultado No-collation:Combining two Implicit expressions that have different collations yields a result of No-collation:

    Implicit X + Implicit Y = No-collation Implicit X + Implicit Y = No-collation

  • La combinación de una expresión con la etiqueta No-collation y una expresión con cualquier etiqueta excepto Explicit (vea la regla siguiente), genera un resultado con la etiqueta No-collation: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:

    No-collation + cualquier etiqueta = No-collation No-collation + anything = No-collation

  • La combinación de una expresión con la etiqueta No-collation y una expresión con intercalación Explicit genera una expresión con una etiqueta Explicit:Combining an expression with No-collation with an expression that has an Explicit collation, yields an expression with an Explicit label:

    No-collation + Explicit X = Explicit No-collation + Explicit X = Explicit

En la tabla siguiente se resumen las reglas.The following table summarizes the rules.

Etiqueta de coerción de operandosOperand coercion label Explicit XExplicit X Implicit XImplicit X Coercible-defaultCoercible-default No-collationNo-collation
Explicit YExplicit Y Genera un errorGenerates Error Da como resultado Explicit YResult is Explicit Y Da como resultado Explicit YResult is Explicit Y Da como resultado Explicit YResult is Explicit Y
Implicit YImplicit Y Da como resultado Explicit XResult is Explicit X Da como resultado No-collationResult is No-collation Da como resultado Implicit YResult is Implicit Y Da como resultado No-collationResult is No-collation
Coercible-defaultCoercible-default Da como resultado Explicit XResult is Explicit X Da como resultado Implicit XResult is Implicit X Da como resultado Coercible-defaultResult is Coercible-default Da como resultado No-collationResult is No-collation
No-collationNo-collation Da como resultado Explicit XResult is Explicit X Da como resultado No-collationResult is No-collation Da como resultado No-collationResult is No-collation Da como resultado No-collationResult is No-collation

Las siguientes reglas adicionales también se aplican a la prioridad de intercalación:The following additional rules also apply to collation precedence:

  • No puede haber varias cláusulas COLLATE en una expresión que ya sea una expresión explícita.You cannot have multiple COLLATE clauses on an expression that is already an explicit expression. Por ejemplo, la cláusula WHERE siguiente no es válida porque se ha especificado una cláusula COLLATE para una expresión que ya es una expresión 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

  • No se permiten las conversiones de páginas de códigos para los tipos de datos text.Code page conversions for text data types are not allowed. No puede convertir una expresión text de una intercalación a otra si tienen páginas de códigos diferentes.You cannot cast a text expression from one collation to another if they have the different code pages. El operador de asignación no puede asignar valores cuando la intercalación del operando de texto de la derecha tiene una página de códigos distinta de la del operando de texto de la izquierda.The assignment operator cannot assign values when the collation of the right text operand has a different code page than the left text operand.

La prioridad de intercalación se determina después de la conversión de los tipos de datos.Collation precedence is determined after data type conversion. El operando del que se obtiene la intercalación resultante puede ser distinto del operando que proporciona el tipo de datos del 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. Considere, por ejemplo, el siguiente 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'  

El tipo de datos Unicode de la expresión simple N'abc' tiene una prioridad de tipo de datos superior.The Unicode data type of the simple expression N'abc' has a higher data type precedence. Por tanto, la expresión resultante tiene el tipo de datos Unicode asignado a N'abc'.Therefore, the resulting expression has the Unicode data type assigned to N'abc'. Sin embargo, la expresión CharCol tiene una etiqueta de intercalación Implicit y N'abc' tiene una etiqueta de coerción Coercible-default, que es inferior.However, the expression CharCol has a collation label of Implicit, and N'abc' has a lower coercion label of Coercible-default. Por lo tanto, la intercalación que se utiliza es la intercalación French_CI_AS de CharCol.Therefore, the collation that is used is the French_CI_AS collation of CharCol.

Ejemplos de reglas de intercalaciónExamples of Collation Rules

En los ejemplos siguientes se muestra el funcionamiento de las reglas de intercalación.The following examples show how the collation rules work. Para ejecutar los ejemplos, cree la siguiente tabla de prueba.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  

Conflictos y errores de intercalaciónCollation Conflict and Error

El predicado de la siguiente consulta presenta un conflicto de intercalación y genera un error.The predicate in the following query has collation conflict and generates an error.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol;  

El conjunto de resultados es el siguiente.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.  

Etiqueta Explicit y etiqueta ImplicitExplicit Label vs. Implicit Label

El predicado de la siguiente consulta se evalúa en la intercalación greek_ci_as porque la expresión de la derecha tiene la etiqueta Explicit.The predicate in the following query is evaluated in collation greek_ci_as because the right expression has the Explicit label. Ésta tiene prioridad sobre la etiqueta Implicit de la expresión de la izquierda.This takes precedence over the Implicit label of the left expression.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol COLLATE greek_ci_as;  

El conjunto de resultados es el siguiente.Here is the result set.

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

Etiquetas No-CollationNo-Collation Labels

Las expresiones CASE de las siguientes consultas tienen una etiqueta No-collation, por lo que no pueden aparecer en la lista de selección ni funcionar con operadores que distinguen la intercalación.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. No obstante, las expresiones pueden funcionar con operadores que no distinguen la intercalación.However, the expressions can be operated on by collation-insensitive operators.

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

El conjunto de resultados es el siguiente.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;  

El conjunto de resultados es el siguiente.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;  

El conjunto de resultados es el siguiente.Here is the result set.

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

Distinción y no distinción de la intercalaciónCollation Sensitive and Collation Insensitive

Los operadores y las funciones pueden distinguir o no las intercalaciones.Operators and functions are either collation sensitive or insensitive.

Distinción de la intercalaciónCollation sensitive
Significa que, al especificar un operando No-collation, se genera un error en tiempo de compilación.This means that specifying a No-collation operand is a compile-time error. El resultado de la expresión no puede ser No-collation.The expression result cannot be No-collation.

No distinción de la intercalaciónCollation insensitive
Significa que los operandos y el resultado pueden ser No-collation.This means that the operands and result can be No-collation.

Operadores e intercalaciónOperators and Collation

Los operadores de comparación, así como los operadores MAX, MIN, BETWEEN, LIKE e IN, distinguen la intercalación.The comparison operators, and the MAX, MIN, BETWEEN, LIKE, and IN operators, are collation sensitive. La cadena que utilizan los operadores se asigna a la etiqueta de intercalación del operando que tiene mayor prioridad.The string used by the operators is assigned the collation label of the operand that has the higher precedence. La instrucción UNION también distingue la intercalación, y todos los operandos de cadena y el resultado final reciben la intercalación del operando que tiene la prioridad más alta.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. La prioridad de intercalación del operando UNION y del resultado se evalúan columna a columna.The collation precedence of the UNION operand and result are evaluated column by column.

El operador de asignación no distingue la intercalación y la expresión de la derecha se convierte a la intercalación de la izquierda.The assignment operator is collation insensitive and the right expression is cast to the left collation.

El operador de concatenación de cadenas distingue la intercalación, por lo que a los dos operandos de cadena y al resultado se les asigna la etiqueta de intercalación del operando que tiene la prioridad de intercalación más 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. Las instrucciones UNION ALL y CASE no distinguen la intercalación, y a todos los operandos de cadena y al resultado final se les asigna la etiqueta de intercalación del operando que tiene la prioridad más alta.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. La prioridad de intercalación de los operandos UNION ALL y del resultado se evalúan columna a columna.The collation precedence of the UNION ALL operands and result are evaluated column by column.

Funciones e intercalaciónFunctions and Collation

Las funciones CAST, CONVERT y COLLATE distinguen la intercalación para los tipos de datos char, varchar y text.THE CAST, CONVERT, and COLLATE functions are collation sensitive for char, varchar, and text data types. Si la entrada y la salida de las funciones CAST y CONVERT son cadenas de caracteres, la cadena de salida tiene la etiqueta de intercalación de la cadena 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. Si la entrada no es una cadena de caracteres, la cadena de salida es Coercible-default, y se le asigna la intercalación de la base de datos actual para la conexión o de la base de datos que contiene la función definida por el usuario, el procedimiento almacenado o el desencadenador en el que se hace referencia a CAST o CONVERT.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 las funciones integradas que devuelven una cadena pero no reciben una entrada de cadena, la cadena de resultado es Coercible-default, y se le asigna la intercalación de la base de datos actual o la intercalación de la base de datos que contiene la función definida por el usuario, el procedimiento almacenado o el desencadenador en el que se hace referencia a la función.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.

Las funciones siguientes distinguen la intercalación y sus cadenas de salida tienen la etiqueta de intercalación de la cadena 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

Ver tambiénSee Also

COLLATE (Transact-SQL) COLLATE (Transact-SQL)
Conversión de tipos de datos (motor de base de datos) Data Type Conversion (Database Engine)
Operadores (Transact-SQL) Operators (Transact-SQL)
Expresiones (Transact-SQL)Expressions (Transact-SQL)