2017-07-26 56 views
1

我们从今天的生产中获得了有趣的问题:)现在一切都很好,但我仍然不明白一件事。让我告诉你这个问题。SQL Server与空白空间的nvarchar比较

IF OBJECT_ID('tempdb.dbo.#results', 'U') IS NOT NULL 
    DROP TABLE #results; 

CREATE TABLE #results(
    [id] smallint, 
    [name] nvarchar(128) 
) 
insert into #results values (1, 'JOHN NOWAK  '), (2, 'frog'), (3, 'wine') 

declare @nazwa_p nvarchar(128) = 'JOHN NOWAK'; 

SELECT * FROM #results WHERE [name] = @nazwa_p 
SELECT * FROM #results WHERE [name] like @nazwa_p 

首先查询结果

1 JOHN NOWAK 

第二个查询给我什么。这是为什么? =运营商是否运行RTRIM()方法?

感谢任何答案。

回答

2

等号比较中忽略尾随空格。在你喜欢的条款中,你缺少%。我添加了一个新变量来显示如何完成这个任务。

IF OBJECT_ID('tempdb.dbo.#results', 'U') IS NOT NULL 
    DROP TABLE #results; 

CREATE TABLE #results(
    [id] smallint, 
    [name] nvarchar(128) 
) 
insert into #results values (1, 'JOHN NOWAK  '), (2, 'frog'), (3, 'wine') 

declare @nazwa_p nvarchar(128) = 'JOHN NOWAK'; 

declare @nazwa_p2 nvarchar(128) = '%JOHN NOWAK%'; 

SELECT * FROM #results WHERE [name] = @nazwa_p 
SELECT * FROM #results WHERE [name] like @nazwa_p2 
SELECT * FROM #results WHERE [name] like '%' + @nazwa_p + '%' 
+0

感谢您的回答,我们已经添加了通配符匹配%,但是我们不知道在等号比较中忽略了尾部空格,我找不到在文档:) – Zabaa

+2

[这是ANSI标准](https://support.microsoft.com/en-us/help/316626/inf-how-sql-server-compares-strings-with-trailing-spaces)。如果你愿意,你可以将你的实例设置为**而不是** – scsimon

1

当您使用equal(=)运算符时,SQL服务器将两个值填充为相等长度。对于其他运营商(如HAVING或WHERE)也会发生这种情况。请参阅ANSI/ISO SQL-92规范。

like运算符不会执行该填充。这是使用相等运算符和没有通配符的LIKE运算符之间的唯一区别。为了获得同样的结果,你将需要:

在这种情况下,如将前或给定的文本后匹配任何数量的空格。 (请注意,在上面的示例中,方括号中有一个空格