3

我的名字和姓氏带有尾随空格。我有两个 SQL 查询——即使我搜索没有空格,第一个查询也会返回结果。(第一个查询返回不需要的结果)。

  1. 这种行为在所有版本的 SQL Server 中是否一致?
  2. 这是一种已知的行为吗?它是否记录在msdnfor 的任何地方SQL Server 2008 R2

代码

DECLARE @NameTable TABLE (first_name varchar(40),last_name varchar(40))
INSERT INTO @NameTable VALUES ('STEVEN    ','STANLEY   ');


--QUERY 1
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (first_name = 'STEVEN')
AND (last_name = 'STANLEY')


--QUERY 2       
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (( ISNULL(first_name,'')+' ' +ISNULL(last_name,'') ) = 'STEVEN STANLEY')

--QUERY 3   (With LTRIM and RTRIM)    
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (( ISNULL(LTRIM(RTRIM(first_name)),'')+' ' +ISNULL(LTRIM(RTRIM(last_name)),'') ) = 'STEVEN STANLEY')

参考

  1. 数据长度
  2. 在 SQL Server 2005 中,len() 和 datalength() 有什么区别?
4

2 回答 2

5

请参阅http://support.microsoft.com/kb/316626

SQL Server 遵循关于如何比较字符串和空格的 ANSI/ISO SQL-92 规范(第 8.2 节,一般规则 #3)。ANSI 标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响 WHERE 和 HAVING 子句谓词的语义以及其他 Transact-SQL 字符串比较。例如,Transact-SQL 认为字符串“abc”和“abc”对于大多数比较操作是等效的。

此规则的唯一例外是 LIKE 谓词。当 LIKE 谓词表达式的右侧包含一个带有尾随空格的值时,SQL Server 不会在比较发生之前将这两个值填充到相同的长度。因为根据定义,LIKE 谓词的目的是促进模式搜索而不是简单的字符串相等测试,所以这并不违反前面提到的 ANSI SQL-92 规范部分。

如果你想避免这种情况,你可以添加一个附加条件,如下所示

参考:数据长度

SELECT first_name AS [FirstName], last_name AS [LastName],first_name+last_name,LEN(first_name+last_name)
FROM  @NameTable A
WHERE (first_name = 'STEVEN') and DATALENGTH(first_name)=DATALENGTH(RTRIM(first_name))
AND (last_name = 'STANLEY') and DATALENGTH(last_name)=DATALENGTH(RTRIM(last_name))
于 2012-12-18T12:51:17.670 回答
2

但是我不能说我有一些与字符串与尾随空格的比较相关的东西--- http://support.microsoft.com/kb/316626

(编辑)

你能检查这个代码吗?

SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (left(first_name,6) = 'STEVEN')+' '+(right(last_name,6) = 'STANLEY')

(对于有 6 个字符的名称)

于 2012-12-18T12:46:23.043 回答