2013-11-02 157 views
0

我在我的數據庫中有許多表都有全文目錄。我剛剛創建了一個新的,由於某種原因,這個不起作用。SQL Server 2012全文搜索Sproc

該目錄創建如下:

GO 
CREATE FULLTEXT CATALOG LicenseeName_catalog AS DEFAULT; 
GO 

CREATE FULLTEXT INDEX ON Licensees 
( 
    CompanyName Language 1033 
) 
    KEY INDEX [PK_dbo.Licensees] ON LicenseeName_catalog WITH CHANGE_TRACKING AUTO 
GO 

而且我的存儲過程是這樣的:

CREATE PROCEDURE [dbo].[LicenseeSearch] @inputterm NVARCHAR(256), 
             @includeNonSearchable BIT, 
             @skip INT, 
             @take INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

DECLARE @searchterm NVARCHAR(256) 

SET @searchterm = '"' + @inputterm + '*"' 
    SELECT * FROM 
     [dbo].[Licensees] lic 
    WHERE CONTAINS(lic.*, @searchterm) 
END 

顯然全文的東西是正確安裝我的其他目錄是否按預期工作。我已經完成了索引的重建。奇怪的是目錄的創建和sprocs在結構上或多或少是相同的,所以爲什麼一個人不工作?

除非我犯了一個錯誤,我已經錯過了。任何想法,將不勝感激。

+2

「不工作」是一個非常簡短的問題描述... – usr

+0

這是,但我只是想不出任何方式得到任何關於什麼問題可能的更多信息。添加測試數據並執行sproc永遠不會返回任何東西,但所有的t-SQL似乎都是有效的。 – Jammer

+0

用硬編碼的搜索字符串手動執行查詢。更改代碼以查看問題出在哪裏。 – usr

回答

0
CREATE PROCEDURE [dbo].[LicenseeSearch] @inputterm NVARCHAR(256), 
             @includeNonSearchable BIT, 
             @skip INT, 
             @take INT 
AS 
BEGIN 
    SET NOCOUNT ON; 


DECLARE @searchterm NVARCHAR(256); 
DECLARE @Sql NVARCHAR(MAX); 

SET @searchterm = '"' + @inputterm + '*"' 


SET @Sql= 'SELECT * FROM 
     [dbo].[Licensees] lic 
    WHERE CONTAINS(lic.*,'''+ @searchterm +''')' 

    EXECUTE sp_executesql @Sql 
END 

試試這個,因爲當你通過@searchterm到您的查詢傳遞參數爲「someValue中*」,其中作爲查詢期待這樣的事情「‘someValue中*’」這就是魔鬼動態SQL進來。

+0

那麼相同的語法在我的其他存儲過程中如何工作? – Jammer

+0

@Jammer你傳遞參數的方式,它會將inputterm的值作爲「SomeValue *」傳遞,當你使用動態sql時,它將傳遞值爲'「SomeValue *」'。你現在能看到差異嗎?如果使用SET searchterm ='「'+ inputterm +'*」',它將保存在字符串中傳遞的值,但不保存外部逗號,而是包含'your_Value'等單個逗號所傳遞的值。在動態sql中,您可以在您的sql語句中添加逗號並傳遞參數。 –

+0

我剛剛嘗試過使用它,它也不起作用。問題似乎是全文目錄。 – Jammer