我尝试了以下查询(测试数据),找到了 SPACES trimmed automatically
。
DECLARE @Employees TABLE(EmpID INT IDENTITY(1,1), FirstName VARCHAR(10), LastName VARCHAR(10))
INSERT INTO @Employees VALUES
('Mani',' '),
('Muthu','Kumar'),
('Ram','Prasath'),
('Elango',''),
('Prabhu',' ')
DECLARE @Name VARCHAR(10) = ' ' -- 2 Spaces
-- SELECT LEN(@Name) -- 0
-- Returned rows with empty LastName
SELECT * FROM @Employees WHERE LastName = @Name
-- Update - Multiple spaces
UPDATE @Employees SET LastName = NULLIF(LastName, ' ') -- All empty last name updated
SELECT * FROM @Employees
在上面的例子中,我搜索了行LastName with 2 spaces
。但它返回所有具有空LastName 的行。我检查了给定参数值的长度。它显示0 (actually 6 spaces)
。
我尝试更新包含多个空格的LastName(例如,尝试了2个空格),但它 updated all the records with empty LastName
如何进行自动修剪?
我正在使用SQL Server 2012。
答案 0 :(得分:5)
1)LEN
记录为:
返回指定字符串表达式的字符数,不包括尾随空格。
(我的重点)
和2)记录了How SQL Server compares strings with trailing spaces:
ANSI标准要求对比较中使用的字符串进行填充,以便在比较它们之前匹配它们的长度。填充直接影响WHERE和HAVING子句谓词以及其他Transact-SQL字符串比较的语义。例如,Transact-SQL认为字符串&#39; abc&#39; 和&#39; abc&#39; 在大多数比较操作中都是等效的。< / p>
...
(事实上,从技术上讲,发生的事情不是修剪而是填充。如果你能真正找到一种证明这种差异的方法,可以获得奖励积分)
使用这些功能的两种方法 - 一种,您可以使用DATALENGTH
。另一个是你可以附加一个尾随的非空格字符,用作哨兵。