2017-07-26 53 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運算符之間的唯一區別。爲了獲得同樣的結果,你將需要:

在這種情況下,如將前或給定的文本後匹配任何數量的空格。 (請注意,在上面的示例中,方括號中有一個空格