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

Jes*_*aja 1 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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我搜索了行LastName with 2 spaces.但是它返回了所有具有空LastName的行.我检查了给定参数值的长度.它表明0 (actually 6 spaces).

我试图更新包含多个空格的LastName(例如,尝试了2个空格),但它 updated all the records with empty LastName

如何自动修剪?

我正在使用SQL Server 2012.

Dam*_*ver 5

1)LEN记录为:

返回指定字符串表达式的字符数,不包括尾随空格.

(我的重点)

2)SQL Server如何将字符串与尾随空格进行比较:

ANSI标准要求对比较中使用的字符串进行填充,以便在比较它们之前使它们的长度匹配.填充直接影响WHERE和HAVING子句谓词以及其他Transact-SQL字符串比较的语义.例如,Transact-SQL认为字符串'abc''abc'在大多数比较操作中都是等效的.

...

(事实上​​,从技术上讲,所发生的事情不是修剪而是填充.如果你能真正找到一种方法来证明这种差异,那就是奖励积分)


使用这些功能的两种方法 - 一种,您可以使用DATALENGTH.另一个是你可以附加一个尾随的非空格字符,用作哨兵.