空格自动修剪[2spaces = 5spaces]

时间:2014-08-11 12:03:07

标签: sql-server sql-server-2012

我尝试了以下查询(测试数据),找到了 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。

1 个答案:

答案 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。另一个是你可以附加一个尾随的非空格字符,用作哨兵。