= (字符串比较或赋值)
适用于:Microsoft Fabric Microsoft Fabric Warehouse 中的 SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics 终结点
比较 WHERE
或 HAVING
子句中的两个字符串,或者将变量或列设置为公式右侧的字符串或字符串操作的结果。 例如,如果变量 @x
等于 'Adventure'
,则 WHERE @x = 'Adventure'
比较 @x
的原始值是否与字符串值 'Adventure'
完全一致。 此外,还可以将 =
运算符用作赋值运算符。 例如,可以调用 SET @a = 'AdventureWorks'
。
语法
expression = expression
参数
expression
指定字符和二进制数据类型类别中的任何一个数据类型的有效表达式,但 image、ntext 或 text 数据类型除外。 两个表达式必须具有相同的数据类型,或者其中一个表达式必须能够隐式转换为另一个表达式的数据类型。
在二进制字符串之间比较或赋值二进制字符串和任何字符串时,必须使用 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
仅影响是否对插入表中的值进行尾随空格剪裁,因此会影响存储,但不影响比较。
示例
A. 比较 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