3

我正在尝试使用存储过程来创建一个表,该表通过获取主题名称并使用与该主题名称相关联的关键字和权重来确定它们应该如何排名来对帖子进行排名。我一直在尝试使用 CONTAINSTABLE 和 ISABOUT,但在将关键字和权重放入 ISABOUT 语句时遇到了麻烦。我尝试将关键字和权重从它们所在的表中转换为 varchar 变量,并将该变量放入 ISABOUT 语句中,但是当我运行 SP 时,结果表为空,所以我假设变量不工作,我不知道从这里去哪里。

这是我到目前为止所拥有的:

CREATE PROCEDURE rankingSP (@Topic varchar(30))
AS
BEGIN
    --creates table to display when sp is executed  
    CREATE TABLE #rankingTable(
    Post_ID     int,
    Post_cont   varchar(max),
    [Rank]      decimal(18,2))

    --creates string with keywords and weights
    DECLARE @keywordString varchar(max)
    SELECT @keywordString = COALESCE(@keywordString + ',','') 
    + Keyword + ' ' + 'WEIGHT' + '(' + CONVERT(varchar,K_weight) + ')'
    FROM Keyword
    PRINT @keywordString

    --inserts rankings into rankingTable
    INSERT INTO #rankingTable
    SELECT
    p.[Post_ID],
    p.[Post_cont],
    ct.[RANK]
    FROM CONTAINSTABLE
    (
    Post,
    Post_cont,
    N'ISABOUT (@keywordString)'
    ) ct
    INNER JOIN Post p
    ON ct.[KEY] = p.Post_ID
    ORDER BY ct.[RANK] DESC;

    --displays the ranking table
    SELECT * FROM #rankingTable
    ORDER BY [Rank]DESC
END
4

1 回答 1

1

在我看来,由于您传递搜索条件的方式,sql引擎不会将其识别为变量,而只是一个字符串。我已经有一段时间没有做任何事情了,CONTAINSTABLE但我认为如果你像这样尝试它应该可以工作。

--- snippet
FROM CONTAINSTABLE
(
 Post,
 Post_cont,
 N'ISABOUT (' + @keywordString + ')'
)
ct
INNER JOIN Post p
  ON ct.[KEY] = p.Post_ID
  ORDER BY ct.[RANK] DESC;

此外,您可能需要传递 "" 引号。这是一个类似的问题,它演示了相同的概念。

于 2012-10-13T23:27:01.387 回答