[SQL SERVER]注意尾端空白

網友問題:DISTINCT 使用疑問

'AAA'.'AAA '明明兩筆資料不同,為什麼SQL Server卻認為是相同資料呢?

 

原文

今天看到一個有趣的問題,明明兩筆不同的資料,使用distinct或group by結果卻只有一筆,要怎麼解決該問題呢?

由於SQL Server是遵守 ANSI/ISO SQL-92 規範,除了Like unicode([SQL SERVER][Memo]LIKE statement)以外,

大部分字串尾端空白進行比較都會自動忽略,了解這行為後,該問題就容易解決了。

 

declare @T table (FS varchar(50))
INSERT INTO @T VALUES('AAA')
INSERT INTO @T VALUES('AAA ')
select * from @T
select distinct * from @T
select FS from @T GROUP BY FS

可以看到 'AAA'和'AAA '被視為相同字串。

再用一個例子驗證SQL Server比較字串是遵守 ANSI/ISO SQL-92 規範

明明兩筆不同的資料,但SQL SERVER卻出現PK錯誤(值重複)。

回到網友問題,如何讓SQL SERVER顯示正確資料(兩筆)呢?很簡單,使用DATALENGTH就可以

 

參考

INF: How SQL Server Compares Strings with Trailing Spaces

Eliminating Duplicates with DISTINCT

SET ANSI_PADDING (Transact-SQL)