2016-07-25 30 views
0

我在表格上創建了​​全文索引列。MS SQL - 包含可變數量值的全文搜索,不使用動態sql

我有一個存儲過程,我可以傳遞一個變量的值「搜索此文本」。我想在全文欄中搜索「搜索」,「本」和「文本」。要搜索的單詞數量是可變的。

我可以使用類似

WHERE column LIKE '%search%' OR column LIST '%this%' OR column LIKE '%text%' 

但這需要我使用動態SQL,我正在努力避免的。

如何使用我的全文搜索來查找每個單詞,可能使用CONTAINS,並且不將整個存儲過程轉換爲動態SQL?

+0

'動態SQL,我試圖避免' - >爲什麼? –

+0

您可能會閱讀這篇關於搜索類型查詢的文章。 http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ –

+0

@AaronBertrand - 我們的前輩希望我們儘可能避免。 – SlowCoder74

回答

0

select * from table where contains(columnname,'"text1" or "text2" or "text3"') 

見鏈接供你考慮。

我知道你的高級職員希望避免動態SQL,但我堅信動態SQL不是邪惡的。

在下面的例子中,可以看到,與幾個參數(或甚至默認值),和代碼3行,可以:

1) Dynamically search any source 
2) Return desired or all elements 
3) Rank the Hit rate 

的SQL

Declare @SearchFor varchar(max) ='Daily,Production,default' -- any comma delim string 
Declare @SearchFrom varchar(150) ='OD'      -- table or even a join statment 
Declare @SearchExpr varchar(150) ='[OD-Title]+[OD-Class]'  -- Any field or even expression 
Declare @ReturnCols varchar(150) ='[OD-Nr],[OD-Title]'  -- Any field(s) even with alias 

Set @SearchFor = 'Sign(CharIndex('''+Replace(Replace(Replace(@SearchFor,' , ',','),', ',''),',',''','[email protected]+'))+Sign(CharIndex(''')+''','[email protected]+'))' 
Declare @SQL varchar(Max) = 'Select * from (Select Distinct'[email protected]+',Hits='[email protected]+' From '[email protected] + ') A Where Hits>0 Order by Hits Desc' 
Exec(@SQL) 

返回

OD-Nr OD-Title     Hits 
3  Daily Production Summary 2 
6  Default Settings   1 

我應該補充一點,我的搜索字符串是逗號分隔的,但您可以更改爲空格。

另一個注意事項CharIndex在LIKE上可能實質上更快。看一眼 http://cc.davelozinski.com/sql/like-vs-substring-vs-leftright-vs-charindex

0

所以我想我想出了一個解決方案。我創建了以下標量函數:

CREATE FUNCTION [dbo].[fn_Util_CONTAINS_SearchString] 
(
    @searchString NVARCHAR(MAX), 
    @delimiter NVARCHAR(1) = ' ', 
    @ANDOR NVARCHAR(3) = 'AND' 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    IF @searchString IS NULL OR LTRIM(RTRIM(@searchString)) = '' RETURN NULL 

    -- trim leading/trailing spaces 
    SET @searchString = LTRIM(RTRIM(@searchString)) 

    -- remove double spaces (prevents empty search terms) 
    WHILE CHARINDEX(' ', @searchString) > 0 
    BEGIN 
     SET @searchString = REPLACE(@searchString,' ',' ') 
    END 

    -- reformat 
    SET @searchString = REPLACE(@searchString,' ','" ' + @ANDOR + ' "') -- replace spaces with " AND " (quote) AND (quote) 
    SET @searchString = ' "' + @searchString + '" ' -- surround string with quotes 

    RETURN @searchString 
END 

我可以得到我的結果:

DECLARE @ftName NVARCHAR (1024) = dbo.fn_Util_CONTAINS_SearchString('value1 value2',default,default) 
SELECT * FROM Table WHERE CONTAINS(name,@ftName) 

我將不勝感激任何的意見/建議。