2013-09-24 32 views
7

我在使用CONTAINS謂詞重寫現有流程時遇到問題。現有的流程正在使用CURSOR,但它確實很慢,並且隨着插入的數據越來越慢。SQL Server CONTAINS謂詞 - 使用列值作爲<contains_condition>

我已經由包含兩個表一個簡單的例子(下面的代碼) - 酮是全文收錄,另一個具有識別CONTAINS條件來選擇來自所述第一行的一列。

當前存儲過程使用CURSOR循環遍歷第二個表,設置@filter變量,然後使用CONTAINS來查找匹配的第一個表中的行。問題是它運行了幾個小時,並且變得更糟。

爲了加快這個過程,我試圖直接在列值上使用謂詞,而不是經歷遊標的痛苦......但是我得到一個語法錯誤。我的例子如下。

我試過執行CROSS APPLY,我也試圖編寫一個用戶定義的函數(fnCONTAINS)沒有運氣。

IF (object_id('Players') IS NOT NULL) 
    DROP TABLE Players 

go 

IF (object_id('TeamNeeds') IS NOT NULL) 
    DROP TABLE TeamNeeds 

go 

-- create fulltext catalog ft as default 
go 

CREATE TABLE Players 
    (
    PlayerID  INT IDENTITY(1, 1), 
    PlayerName  VARCHAR(20), 
    PlayerPositions VARCHAR(60) 
) 

go 

CREATE UNIQUE INDEX IXPlayerID 
    ON Players(PlayerID) 

go 

CREATE fulltext INDEX ON Players(PlayerPositions) KEY INDEX IXPlayerID 

go 

INSERT Players 
     (PlayerName, 
     PlayerPositions) 
VALUES('Patrick Travers', 
     'Pitcher,Left Field,Center Field,Right Field,Shortstop') 

go 

CREATE TABLE TeamNeeds 
    (
    TeamID INT, 
    Keywords VARCHAR(50) 
) 

go 

INSERT TeamNeeds 
     (TeamID, 
     Keywords) 
VALUES(1, 
     '"Center Field" and "Shortstop" and "Pitcher"') 

go 

WAITFOR delay '00:00:05' 

go -- Give the Full Text Index process time to populate the catalog 
SELECT PlayerID, 
     PlayerName, 
     PlayerPositions 
FROM Player, 
     TeamNeeds 
WHERE CONTAINS(PlayerPositions, Keywords) 

go -- Syntax error on Keywords... 
SELECT PlayerID, 
     PlayerName, 
     PlayerPositions 
FROM Players, 
     TeamNeeds 
WHERE CONTAINS(PlayerPositions, '"Center Field" and "Shortstop" and "Pitcher"') 

go -- Works just fine, but requires setting an explicit search expression for every search, which is terribly slow 
+0

我刪除了評論分隔符,所以讓你的代碼更具可讀性。 – Khan

+0

我一直在尋找回答這個問題。我看着雖然stackoverflow和MS的文檔,但它看起來像你不能做CONTAINS(table1.col,table2.col)。你只能做CONTAINS(table1.col,'文本')或CONTAINS(table1.col,@some_text)。我希望有人來證明我錯了。 – Nico

+0

你有沒有想過如何解決這個問題?我有完全相同的問題。 –

回答

2

這隻有在我可以看到多語句TVF時纔可能。

創建下面的函數

CREATE FUNCTION [dbo].[ft_test] (@Keywords VARCHAR(50)) 
RETURNS @ReturnTable TABLE (
    PlayerID  INT, 
    PlayerName  VARCHAR(20), 
    PlayerPositions VARCHAR(60)) 
AS 
    BEGIN 
     INSERT INTO @ReturnTable 
     SELECT PlayerID, 
      PlayerName, 
      PlayerPositions 
     FROM Players 
     WHERE CONTAINS(PlayerPositions, @Keywords) 

     RETURN 
    END 

那麼下面的工作正常

SELECT * 
FROM TeamNeeds 
     CROSS APPLY [dbo].[ft_test] (Keywords) CA 

雖然內嵌版本失敗,「內聯函數‘X因爲它採用了’不能把相關的參數或子查詢全文操作員「。