2014-04-30 274 views
0

我創建了一個學生表並具有以下記錄。在SQL Server中使用CONTAINS搜索

enter image description here

我想執行同一表上的搜索。我試着用下面的查詢。

SELECT * FROM Students WHERE Name LIKE '%AM%' 

它返回前兩行的結果集,這是正確的。

我想使用關鍵字CONTAINS而不是LIKE來執行相同的查詢。

我試過下面的查詢,但它沒有返回任何結果集。

SELECT * FROM Students WHERE CONTAINS(Name,'"AM"') 
SELECT * FROM Students WHERE CONTAINS(Name,'"AM*"') 
SELECT * FROM Students WHERE CONTAINS(Name,'"*AM*"') 

請幫我解決這個問題。

在此先感謝。

+6

是[全文索引](http://technet.microsoft.com/en-us/library/ms187317.aspx)中的列嗎?除此之外,它是「AM」而不是「」AM「」。 –

+1

閱讀「contains」文檔(http://technet.microsoft.com/en-us/library/ms187787.aspx)。第二段給出了「包含」可以搜索的項目的列表。一個詞中間的模式不在列表中。 –

+2

Hi Tim, 感謝您的回覆。 你能告訴我,我怎樣才能在這張桌子上創建一個全文索引? 謝謝 – Sanoop

回答

0
  1. 開始MSSQLFDLauncher(SQL服務器 - >配置工具 - >配置管理器 - >全文篩選器守護程序啓動器 - >啓動)
  2. 運行這個代碼(或像這樣與你需要的指數)

    CREATE UNIQUE INDEX IX_ID學生(ID)

    CREATE FULLTEXT CATALOG斯圖dents_目錄

  3. 您不能使用全文搜索與中間的單詞,使用CTE也不正確(因爲全文索引),所以我們會嘗試使用一些技巧...

  4. 是分裂的名字,讓每個字母就像一個字

    添加功能

    /* 作者:保羅·辛普森(!亞歷克斯Peshik用於測試目的修改) 創建日期:2012年7月19日(修改5/6/2014) 說明:在字母之間加空格+下劃線。例如: 「喬治」 變成了 「_G _E _O _R _G _E」 */

CREATE FUNCTION udf_PutSpacesBetweenChars

(@String VARCHAR(100)) 

RETURNS VARCHAR(100) 
AS 
BEGIN 
    DECLARE @pos INT, @result VARCHAR(100); 
    SET @result = @String; 
    SET @pos = 2 -- location where we want first space 
    WHILE @pos < LEN(@result)+1 
    BEGIN 
     SET @result = STUFF(@result, @pos, 0, SPACE(1)); 
     SET @result = STUFF(@result, @pos+1, 0, '_') -- add underscore (to imitate word) 
     SET @pos = @pos+3; -- (the original was +2) 
    END 
    RETURN '_'[email protected]; -- add leading underscore (the original is w/o it) 
END 
  1. 上添加新的列和索引(不能使用持續性只要它是非確定性列)。

    ALTER TABLE學生ADD命名空間的varchar(100)

    UPDATE SET學生命名空間= DBO。udf_PutSpacesBetweenChars

    CREATE FULLTEXT INDEX ON學生(NameSpaced)KEY索引IX_ID ON Students_Catalog;

  2. 使用特殊技術在字母/單詞附近搜索。字之間的距離爲1,TRUE僅表示該順序(「a,m」而不是「m,a」)。

    SELECT * FROM學生WHERE CONTAINS(命名空間, 'NEAR((_一,_m),1,TRUE)')

對不起該解決方案是相當巨大的,我沒有任何想法如何簡化它...