Могу ли я использовать переменную при использовании ISABOUT?

Я пытаюсь использовать хранимую процедуру для создания таблицы, которая ранжирует сообщения, используя название темы и используя ключевые слова и веса, связанные с этим названием темы, чтобы определить, как они должны быть ранжированы. Я пытался использовать 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

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;

Кроме того, вам может понадобиться пройти "" кавычки. Вот аналогичный вопрос, который демонстрирует ту же концепцию.

Другие вопросы по тегам