我終於想出了一個解決我自己的問題,我現在很滿意。
我結束瞭如下面看到這裏(有點長篇大論),這需要3個參數 1.主搜索關鍵字(必須匹配)存儲過程 2.附加必須有逗號分隔字符串(必須匹配) 3附加最好有逗號分隔的字符串
CREATE PROCEDURE [dbo].[GetJobSeekers]
(
@KeywordSearch nvarchar(500),
@MustHave nvarchar(500), --Comma separated skills
@NiceToHave nvarchar(500) --Comma separated skills
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL nvarchar(4000)
DECLARE @SELECT nvarchar(4000)
DECLARE @SEARCH nvarchar(4000)
DECLARE @SEARCH1 nvarchar(4000)
DECLARE @SEARCH2 nvarchar(4000)
DECLARE @WHERE nvarchar(4000)
DECLARE @ORDERBY nvarchar(4000)
/*Used for string split*/
DECLARE @POS int
DECLARE @NEXTPOS int
/*Get Result for primary search key*/
SET @SELECT = 'SELECT ktbl.rank AS [Ranking], jobseekers.*'
SET @SEARCH = 'ISABOUT("'[email protected]+'" weight(1))'
SET @WHERE = ' FROM jobseekers INNER JOIN
CONTAINSTABLE (jobseekers, *, ''' + @SEARCH + ''')
AS ktbl On jobseekers.Id = ktbl.[KEY]'
SET @ORDERBY= 'ORDER BY [Ranking] DESC'
/* Get Result set for all additional must have keywords and INNER JOIN With primary Search */
IF @MustHave <> ''
BEGIN
DECLARE @MustHaveSplitString nvarchar(500)
SET @POS = 1
WHILE(@POS <= LEN(@MustHave))
BEGIN
SELECT @NEXTPOS = CHARINDEX(N',', @MustHave, @POS)
IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL)
SELECT @NEXTPOS = LEN(@MustHave) + 1
SELECT @MustHaveSplitString = RTRIM(LTRIM(SUBSTRING(@MustHave, @POS, @NEXTPOS - @POS)))
SET @SELECT = @SELECT + ', ktbl'[email protected]+'.rank AS [Ranking'[email protected]+']'
SET @ORDERBY = @ORDERBY + ', [Ranking'[email protected]+'] DESC'
SET @SEARCH1 = 'ISABOUT("'[email protected]+'" weight(.8))'
SET @WHERE = @WHERE + ' INNER JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH1 + ''')
AS ktbl'[email protected]+' on Jobseekers.Id = ktbl'[email protected]+'.[KEY]'
SELECT @POS = @NEXTPOS+1
END
END
/*Get result set for all nice to have by stacking them in the isabout searchcondition and LEFT OUTER JOIN with Primary Search + Must have search if its there*/
IF @NiceToHave <> ''
BEGIN
DECLARE @NiceToHaveSplitString nvarchar(500)
SET @SEARCH2 = 'ISABOUT('
SET @POS = 1
WHILE(@POS <= LEN(@NiceToHave))
BEGIN
SELECT @NEXTPOS = CHARINDEX(N',', @NiceToHave, @POS)
IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL)
SELECT @NEXTPOS = LEN(@NiceToHave) + 1
SELECT @NiceToHaveSplitString = RTRIM(LTRIM(SUBSTRING(@NiceToHave, @POS, @NEXTPOS - @POS)))
SET @SEARCH2 = @SEARCH2 + '"'[email protected]+'" weight(.5),'
SELECT @POS = @NEXTPOS+1
END
/*Clean last , off the search2 string */
SET @SEARCH2 = LEFT(@SEARCH2, LEN(@SEARCH2) -1)
/*Close the isabout in search2 string*/
SET @SEARCH2 = @SEARCH2 + ')'
SET @SELECT = @SELECT + ', ktbl2.rank AS [Ranking2]'
SET @ORDERBY = @ORDERBY + ', [Ranking2] DESC'
SET @WHERE = @WHERE + ' LEFT JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH2 + ''')
AS ktbl2 on Jobseekers.Id = ktbl2.[KEY]'
END
SET @SQL = @SELECT + @WHERE + @ORDERBY
EXEC sp_executesql @SQL
END
存儲過程仍然不是100%完成,因爲它需要採取額外的邏輯考慮但它會暫時充當最終結果的殼。另外,我還沒有對任何大量的數據進行測試,所以我仍然不確定它的性能如何。
親切的問候,
MSFT網站表示嵌套允許http://msdn.microsoft.com/en-us/library/ms189760.aspx。你的權利是關於錯誤只有一個和逗號分隔後的值。看看示例A的語法。 – xQbert
逗號分隔他們在一個isabout不會考慮我和/或邏輯的必要。我的示例代碼是以鏈接文章作爲背景編寫的。對我來說,文章會建議我的代碼應該可以工作,但不會。感謝您的回覆。 – Drauka