= (сравнение строк или назначение)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric
Сравнивает две строки в WHERE
предложении или HAVING
предложении или задает переменную или столбец строковой операции в правой части уравнения. Например, если переменная равна, сравнивает исходное значение @x
точно с строковым значением'Adventure'
.WHERE @x = 'Adventure'
'Adventure'
@x
Кроме того, оператор можно использовать =
в качестве оператора назначения. Например, можно вызвать SET @a = 'AdventureWorks'
.
Синтаксис
expression = expression
Аргументы
выражение
Указывает любое допустимое выражение любого из типов данных в категории символьного и двоичного типа данных, кроме типов изображений, ntext или текстовых данных. Оба выражения должны иметь одинаковый тип данных, или одно из выражений должно допускать неявное преобразование к типу данных другого выражения.
Явное преобразование в символьные данные с CONVERT
CAST
или должно использоваться при сравнении или назначении двоичных строк и любых символов между двоичными строками.
Замечания
Сравнение строк с помощью =
оператора предполагает, что обе строки идентичны. Для параметров частичного сравнения строк см. оператор LIKE или предикаты CONTAINS и CONTAINSTABLE с полным текстом.
Ядро СУБД SQL Server следует спецификации ANSI/ISO SQL-92 (раздел 8.2, предикат сравнения, общие правила #3) по сравнению строк с пробелами. Стандарт ANSI требует заполнения для строк символов, используемых в сравнениях, чтобы их длина соответствовала перед сравнением. Заполнение непосредственно влияет на семантику WHERE
предикатов и HAVING
предложений и другие сравнения строк Transact-SQL. Например, Transact-SQL рассматривает строки 'abc'
и 'abc '
эквивалентен для большинства операций сравнения. Единственным исключением из этого правила является предикат LIKE. Если справа от LIKE
выражения предиката имеет значение с конечным пробелом, ядро СУБД не заполняет два значения одинаковой длиной до сравнения. Поскольку назначение LIKE
предиката, по определению, заключается в том, чтобы упростить поиск шаблонов, а не простые тесты на равенство строк, этот предикат не нарушает раздел спецификации ANSI SQL-92, упоминаемой ранее.
Параметр SET ANSI_PADDING
не влияет на то, будут ли строки ядро СУБД панели перед их сравнением. SET ANSI_PADDING
влияет только на то, обрезаются ли конечные пустые значения из вставленных значений в таблицу, поэтому это влияет на хранилище, но не на сравнения.
Примеры
А. Сравнение строк в предложении WHERE
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName = 'Johnson';
B. Сравнение строк в предложении WHERE с помощью преобразования из двоичного файла
DECLARE @LNameBin BINARY (100) = 0x5A68656E67;
SELECT LastName,
FirstName
FROM Person.Person
WHERE LastName = CONVERT(VARCHAR, @LNameBin);
C. Присвоение строк переменной
В этом примере показано простое назначение строковых данных переменной с помощью оператора =.
DECLARE @dbname VARCHAR(100);
SET @dbname = 'Adventure';
D. Сравнение строк с пробелами
В следующих запросах показано сравнение строк, в которых одна сторона содержит пробелы, а другая — нет:
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