sql-server - developer - sql server 2012破解版



空格自动修剪 (1)

我尝试了以下查询(测试数据),并发现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 with 2 spaces行。 但是它返回了所有具有空的LastName的行 。 我检查了给定的参数值的长度。 它显示0 (actually 6 spaces)

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

自动修剪如何发生?

我正在使用SQL Server 2012。


Answer #1

1) LEN记录为:

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

我的重点

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

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

...

(事实上​​,从技术上讲,所发生的并不是修整,而是填充,如果你真的可以找出一种方法来证明这种差异,那么奖励点)

有两种方法来处理这些功能 - 一种,你可以使用DATALENGTH 。 另一个是你可以追加一个尾随的非空格字符,作为一个哨兵使用。





sql-server-2012