2012-12-18 76 views
3

我有名字和姓氏,尾随空格。我有两个SQL查询 - 第一个查询返回结果,即使我搜索没有空格。 (第一个查询返回不需要的结果)。SQL Server WHERE条件不考虑空白

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

CODE

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. DataLength
  2. In SQL Server 2005, what is the difference between len() and datalength()?
+0

可能重复[SQL WHERE尾随空格条款匹配值] (http://stackoverflow.com/questions/4166159/sql-where-clause-matching-values-with-trailing-spaces) – Pondlife

回答

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规范的一部分。

如果你想避免这种情况,你可以添加一个附加条件,将类似于以下

参见:DataLength

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)) 
+0

谢谢。但是,根据参考,它不适用于'SQL Server 2008'。 – Lijo

+1

@Lijo:SQL Server 2008 **仍然遵循ANSI/ISO SQL-92规范.... –

2

我不能说但我已经与尾随空白的字符串比较相关的东西--- http://support.microsoft.com/kb/316626

(EDIT)

可以通过这个代码?

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

(用6个字符的名称)

+0

谢谢。然而,根据参考,它不是'SQL Server 2008' – Lijo

+1

我没有想出这种问题。不过,我会对此进行一些研究并尝试提供更好的答案。 –

+0

@Lijo考虑空白我们可以做到这一点(例如,“SELECT colname FROM table WHERE colname LIKE'%'') –