2016-01-18 19 views
2

我試圖做一些查詢性能,我一直在尋找應用FULLTEXT INDEX與使用LIKE相比。可以CONTAINS處理具有NULL值的表列嗎?

我有一個數據庫瓦特/人的信息,即名字,姓氏等,其中一些列爲空。

當我嘗試使用CONTAINS對象時,出現此錯誤消息;

Null or empty full-text predicate 

我已經把代碼,以確保在@firstName場傳遞的是不爲空,如果空在再傳給我已經將它設置爲「‘’」就像我在其他地方閱讀。我仍然收到錯誤消息。我開始懷疑這是否是一個問題,因爲索引的列是空的。

有沒有人知道如果是這樣的話,我已到處尋找,我無法找到任何有關此信息。

下面是該查詢。 @FirstNameLocal和@LastNameLocal被傳入這個存儲過程。在此示例中,PersonTable中的FirstName和/或LastName字段數據可能爲null。我正在使用SQL Server 2012 w/SP1。 「嘗試使用」意味着當我嘗試在SQL Management Studio中運行查詢時。

SELECT DISTINCT LastName, FirstName, MiddleName, PersonId 
FROM PersonTable 
Where IsDeleted = 0 
AND CONTAINS(FirstName, @FirstNameLocal) 
AND CONTAINS(LastName, @LastNameLocal) 
+0

你嘗試過嗎? http://stackoverflow.com/questions/189765/7645-null-or-empty-full-text-predicate – techspider

+0

向我們顯示您當前的查詢 –

+0

另請:什麼「嘗試使用」是什麼意思?編譯?跑?爲我們提供您的SQL Server版本和表定義。如果適用的話,例如輸入和輸出以及所需的輸出。閱讀關於MVCEs。 – philipxy

回答

0

您可以先檢查您的變量是否爲空或等於空字符串。我想雖然這會部分否定全文索引的好處,但您應該考慮以不同的方式處理(例如使用動態SQL)。

SELECT DISTINCT LastName, FirstName, MiddleName, PersonId 
FROM PersonTable 
Where IsDeleted = 0 
AND (ISNULL(@FirstNameLocal,'')='' OR CONTAINS(FirstName, @FirstNameLocal)) 
AND (ISNULL(@LastNameLocal,'')='' OR CONTAINS(LastName, @LastNameLocal)); 

如果你這樣做與動態SQL它會是這個樣子:

DECLARE @stmt NVARCHAR(4000); 

SET @stmt= 
    N'SELECT DISTINCT LastName, FirstName, MiddleName, PersonId ' + 
    N'FROM PersonTable ' + 
    N'Where IsDeleted = 0' + 
    CASE WHEN ISNULL(@FirstNameLocal,'')='' 
     THEN N'' 
     ELSE N' AND CONTAINS(FirstName, @FirstNameLocal)' 
    END + 
    CASE WHEN ISNULL(@LastNameLocal,'')='' 
     THEN N'' 
     ELSE N' AND CONTAINS(LastName, @LastNameLocal)' 
    END + ';' 

EXEC sp_executesql 
    @stmt, 
    N'@FirstNameLocal VARCHAR(256),@LastNameLocal VARCHAR(256)', 
    @FirstNameLocal, 
    @LastNameLocal; 

缺點是該語句的每個這個腳本運行時再次編譯,但是這將是小與可在本聲明中使用的全文索引的優點相比。

總是比較Actual Execution Plans以選擇最好的版本。

+0

你能展示一個你的意思是用動態sql處理它的例子嗎? –

+0

@RobStewart示例添加 –