Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia administrada de Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Punto de conexión de SQL Analytics en Microsoft Fabric
Almacén en Microsoft Fabric
Base de datos SQL en Microsoft Fabric
La precedencia de intercalación, también conocida como reglas de coerción de intercalación, determina los dos resultados siguientes:
La intercalación del resultado final de una expresión que se evalúa como cadena de caracteres.
Intercalación que usan los operadores que distinguen la intercalación que usan entradas de cadena de caracteres, pero que no devuelven una cadena de caracteres, como
LIKEe 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. Los objetos que tienen otros tipos de datos no participan en las evaluaciones de intercalación.
Etiquetas de intercalación
En la tabla siguiente se enumeran y describen las cuatro categorías en las que se identifican las intercalaciones de todos los objetos. El nombre de cada categoría es la etiqueta de intercalación.
| Etiqueta de intercalación | Tipos de objetos |
|---|---|
Coercible-default |
Cualquier Transact-SQL variable de cadena de caracteres, parámetro, literal o salida de una función integrada de catálogo, o una función integrada que no toma entradas de cadena, sino que genera una salida de cadena. 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. 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. |
Implicit X |
Referencia de columna. La intercalación de la expresión (X) se obtiene de la intercalación definida para la columna en la tabla o vista. Incluso si a la columna se le asignó explícitamente una intercalación mediante una COLLATE cláusula en la CREATE TABLE instrucción o CREATE VIEW , la referencia de columna se clasifica como implícita. |
Explicit X |
Expresión que se convierte explícitamente en una intercalación específica (X) mediante una COLLATE cláusula en la expresión. |
No-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. El resultado de la expresión se define como carente de intercalación. |
Reglas de intercalación
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.
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.
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:
Explicit tiene prioridad sobre Implicit. Implicit tiene prioridad sobre Coercible-default:
> > Implícito implícito por defecto coercible
La combinación de dos expresiones Explicit a las que se han asignado intercalaciones distintas genera un error:
X explícito + Y explícito = error
La combinación de dos expresiones Implicit que tienen intercalaciones distintas genera el resultado No-collation:
X implícito + Y implícito = no intercalación
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:
No-collation + cualquier etiqueta = 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:
Sin intercalación + Explicit X = Explicit
En la tabla siguiente se resumen las reglas.
| Etiqueta de coerción de operandos | X explícito | X implícito | Coercible-default | No-collation |
|---|---|---|---|---|
Explicit Y |
Genera un error | Da como resultado Explicit Y | Da como resultado Explicit Y | Da como resultado Explicit Y |
Implicit Y |
Da como resultado Explicit X | Da como resultado No-collation | Da como resultado Implicit Y | Da como resultado No-collation |
Coercible-default |
Da como resultado Explicit X | Da como resultado Implicit X | Da como resultado Coercible-default | Da como resultado No-collation |
No-collation |
Da como resultado Explicit X | Da como resultado No-collation | Da como resultado No-collation | Da como resultado No-collation |
Las siguientes reglas adicionales también se aplican a la prioridad de intercalación:
No puede tener varias
COLLATEcláusulas en una expresión que ya sea una expresión explícita. Por ejemplo, la cláusula siguienteWHEREno es válida porque se especifica unaCOLLATEcláusula para una expresión que ya es una expresión explícita:WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_ASNo se permiten conversiones de página de códigos para tipos de datos de texto . No se puede convertir una expresión de texto de una intercalación a otra si tienen las distintas páginas de códigos. El operador de asignación no puede asignar valores cuando la intercalación del operando de texto derecho tiene una página de códigos diferente a la del operando de texto izquierdo.
La prioridad de intercalación se determina después de la conversión de los tipos de datos. El operando del que se obtiene la intercalación resultante puede ser distinto del operando que proporciona el tipo de datos del resultado final. Considere, por ejemplo, el siguiente lote:
CREATE TABLE TestTab
(
PrimaryKey INT PRIMARY KEY,
CharCol CHAR (10) COLLATE French_CI_AS
);
SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc';
Nota:
El tipo de datos nvarchar no se admite en Fabric Warehouse, pero la mayoría de los ejemplos de este artículo son aplicables a varchar mediante UTF-8 y nvarchar, por lo que siguen siendo aplicables a Fabric Warehouse a menos que se indique lo contrario.
El tipo de datos Unicode de la expresión simple N'abc' tiene una prioridad de tipo de datos superior. Por tanto, la expresión resultante tiene el tipo de datos Unicode asignado a 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. Por lo tanto, la intercalación que se utiliza es la intercalación French_CI_AS de CharCol.
Ejemplos de reglas de intercalación
En los ejemplos siguientes se muestra el funcionamiento de las reglas de intercalación. Para ejecutar los ejemplos, cree la siguiente tabla de prueba.
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
Conflicto y error de intercalación
El predicado de la siguiente consulta presenta un conflicto de intercalación y genera un error.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;
Este es el 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.
Etiqueta explícita frente a etiqueta implícita
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. Ésta tiene prioridad sobre la etiqueta Implicit de la expresión de la izquierda.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;
Este es el conjunto de resultados.
id GreekCol LatinCol
----------- -------------------- --------------------
1 A a
Etiquetas sin intercalación
Nota:
Debido a la diferencia entre el comportamiento de nvarchar y varchar en una intercalación UTF-8, este ejemplo no se aplica en Fabric Warehouse.
Las CASE expresiones de las consultas siguientes tienen una etiqueta sin intercalación; por lo tanto, no pueden aparecer en la lista de selección ni operarlas mediante operadores que distinguen la intercalación. No obstante, las expresiones pueden funcionar con operadores que no distinguen la intercalación.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab;
Este es el 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;
Este es el 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;
Este es el conjunto de resultados.
--------------------
a
Distinción de intercalación e insensibilidad de intercalación
Los operadores y las funciones pueden distinguir o no las intercalaciones.
- Intercalación confidencial: esto significa que especificar un operando sin intercalación es un error en tiempo de compilación. El resultado de la expresión no puede ser Ninguna intercalación.
- No distingue la intercalación: esto significa que los operandos y el resultado pueden ser Sin intercalación.
Operadores e intercalación
Los operadores de comparación y los MAXoperadores , MIN, BETWEEN, LIKEy IN , distinguen la intercalación. La cadena que utilizan los operadores se asigna a la etiqueta de intercalación del operando que tiene mayor prioridad. La UNION instrucción también distingue intercalación y todos los operandos de cadena y el resultado final se asigna a la intercalación del operando con la prioridad más alta. La prioridad de intercalación del operando y el UNION resultado se evalúan por columna.
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.
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. Las UNION ALL instrucciones y CASE no distinguen la intercalación, y a todos los operandos de cadena y a los resultados finales se les asigna la etiqueta de intercalación del operando con la prioridad más alta. La precedencia de intercalación de los operandos y el UNION ALL resultado se evalúan por columna.
Funciones e intercalación
Las CASTfunciones , CONVERTy COLLATE distinguen intercalación para los tipos de datos char, varchar y text . Si la entrada y salida de las CAST funciones y CONVERT son cadenas de caracteres, la cadena de salida tiene la etiqueta de intercalación de la cadena de entrada. 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 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 o CASTCONVERT .
Para las funciones integradas que devuelven una cadena pero no toman una entrada de cadena, la cadena de resultado es Coercible-default. A la cadena de resultado 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.
Las funciones siguientes distinguen la intercalación y sus cadenas de salida tienen la etiqueta de intercalación de la cadena de entrada:
CHARINDEXDIFFERENCEISNUMERICLEFTLENLOWERPATINDEXREPLACEREVERSERIGHTSOUNDEXSTUFFSUBSTRINGUPPER