= (Comparación de cadenas o asignación)
Se aplica a: punto de conexión de SQL Server Azure SQL Database Azure SQL Instancia administrada punto de conexión de SQL Analytics Analytics Platform System (PDW) de SQL Analytics System (PDW) de SQL Server en Microsoft Fabric Warehouse en Microsoft Fabric
Compara dos cadenas en una cláusula WHERE
o HAVING
, o establece una variable o columna en cadena o resultado de una operación de cadena en el lado derecho de la ecuación. Por ejemplo, si una variable @x
es igual que 'Adventure'
, WHERE @x = 'Adventure'
compara que el valor original de @x
sea exactamente igual que el valor de cadena 'Adventure'
. También puede usar el operador =
como operador de asignación. Por ejemplo, puede llamar a SET @a = 'AdventureWorks'
.
Sintaxis
expression = expression
Argumentos
expression
Especifica cualquier expresión válida de uno de los tipos de datos de la categoría de caracteres o binarios, excepto los tipos de datos image, ntext o text. Ambas expresiones deben ser del mismo tipo de datos o una se debe poder convertir implícitamente en el tipo de datos de la otra.
Debe utilizarse una conversión explícita a datos caracteres con CONVERT
o CAST
cuando se comparan o asignan cadenas binarias y cualesquiera caracteres entre las cadenas binarias.
Observaciones
La comparación de cadenas con el operador =
supone que ambas cadenas son idénticas. Para ver las opciones de comparación parcial de cadenas, consulte el operador LIKE o los predicados de texto completo CONTAINS y CONTAINSTABLE.
El motor de base de datos de SQL Server sigue la especificación ANSI/ISO SQL-92 (sección 8.2, Predicado de comparación, reglas generales n.º 3) sobre cómo comparar cadenas con espacios. La norma ANSI requiere relleno para las cadenas de caracteres que se usan en las comparaciones para que sus longitudes coincidan antes de compararlas. El relleno afecta directamente a la semántica de los predicados de las cláusulas WHERE
y HAVING
, y a otras comparaciones de cadenas de Transact-SQL. Por ejemplo, Transact-SQL considera que las cadenas 'abc'
y 'abc '
son equivalentes para la mayoría de las operaciones de comparación. La única excepción a esta regla es el predicado LIKE. Cuando el lado derecho de una expresión de predicado LIKE
presenta un valor con un espacio final, el motor de base de datos no rellena los dos valores con la misma longitud antes de la comparación. Dado que el propósito del predicado LIKE
, por definición, es facilitar las búsquedas de patrones en lugar de las pruebas de igualdad de cadenas simples, este predicado no infringe la sección de la especificación ANSI SQL-92 mencionada anteriormente.
La configuración SET ANSI_PADDING
no afecta a si el motor de base de datos rellena las cadenas antes de compararlas. SET ANSI_PADDING
solo afecta a si los espacios en blanco finales se recortan de los valores que se insertan en una tabla, y por tanto, al almacenamiento, pero no a las comparaciones.
Ejemplos
A. Comparación de cadenas en una cláusula WHERE
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName = 'Johnson';
B. Comparación de cadenas en una cláusula WHERE mediante la conversión de binarios
DECLARE @LNameBin BINARY (100) = 0x5A68656E67;
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName = CONVERT(VARCHAR, @LNameBin);
C. Asignación de cadenas a una variable
En este ejemplo se muestra una asignación simple de datos de cadena a una variable mediante el operador =.
DECLARE @dbname VARCHAR(100);
SET @dbname = 'Adventure';
D. Comparación de cadenas con espacios
En las consultas siguientes se muestra la comparación entre cadenas en las que un lado contiene espacios y el otro no:
CREATE TABLE #tmp (c1 VARCHAR(10));
GO
INSERT INTO #tmp VALUES ('abc ');
INSERT INTO #tmp VALUES ('abc');
GO
SELECT DATALENGTH(c1) AS 'EqualWithSpace', * FROM #tmp
WHERE c1 = 'abc ';
SELECT DATALENGTH(c1) AS 'EqualNoSpace ', * FROM #tmp
WHERE c1 = 'abc';
SELECT DATALENGTH(c1) AS 'GTWithSpace ', * FROM #tmp
WHERE c1 > 'ab ';
SELECT DATALENGTH(c1) AS 'GTNoSpace ', * FROM #tmp
WHERE c1 > 'ab';
SELECT DATALENGTH(c1) AS 'LTWithSpace ', * FROM #tmp
WHERE c1 < 'abd ';
SELECT DATALENGTH(c1) AS 'LTNoSpace ', * FROM #tmp
WHERE c1 < 'abd';
SELECT DATALENGTH(c1) AS 'LikeWithSpace ', * FROM #tmp
WHERE c1 LIKE 'abc %';
SELECT DATALENGTH(c1) AS 'LikeNoSpace ', * FROM #tmp
WHERE c1 LIKE 'abc%';
GO
DROP TABLE #tmp;
GO