0

Я тестирую перемещение нашей базы данных с SQL Server 2005 до 2008 года. Мы используем CTE для подкачки.SQL Server 2008 CTE И CONTAINSTABLE Statement - Почему ошибка?

При использовании полнотекстового CONTAINSTABLE CTE не запускается и генерирует ошибку.

Вот мой нерабочим код-

WITH results AS ( 
SELECT ROW_NUMBER() over (ORDER BY GBU.CreateDate DESC) as rowNum,    
GBU.UserID, 
NULL AS DistanceInMiles 
FROM User GBU WITH (NOLOCK) 
WHERE 1=1 
AND GBU.CountryCode IN (SELECT [Value] FROM fn_Split('USA',',')) 
AND GBU.UserID IN (SELECT [KEY] FROM CONTAINSTABLE(VW_GBU_Search, *, 'COMPASS')) 
) 
SELECT * from results 
WHERE rowNum BETWEEN 0 and 25 

Если я закомментируйте CONTAINSTABLE линию, оператор выполняет. Если я выполняю только инструкцию SELECT (а не WITH), оператор выполняет штраф.

ООН-полезной Я получаю ошибку на это:

Msg 0, Level 11, State 0, линия 0 серьезная ошибка произошла на текущей команды. Результаты, если таковые имеются, должны быть отброшены . Msg 0, уровень 20, состояние 0, строка 0 Суровая ошибка произошла в текущей команде. Результаты, если любой, должны быть отброшены.

Любые предложения?

+0

вам нужно выделить строки кода (например, ваш SQL заявление), а затем нажмите кнопку «код» (101 010) на панели инструментов редактора (или нажмите Ctrl-K на клавиатуре) для удобного форматирования и синтаксиса выделите эти разделы кода! –

ответ

1

Предполагая, что другие ответы верны и что основная проблема связана с ошибкой, поскольку вы не ссылаетесь на RANK из CONTAINSTABLE, возможно, запрос, похожий на следующий, будет обходным путем, где «ID» является столбцом идентификатора в VW_GBU_Search (untested)?

;WITH results AS ( 
SELECT ROW_NUMBER() OVER (ORDER BY GBU.CreateDate DESC) AS rowNum,      
    GBU.UserID, 
    NULL AS DistanceInMiles 
    FROM User GBU WITH (NOLOCK) 
    WHERE 1=1 
    AND GBU.CountryCode IN (SELECT [Value] FROM fn_Split('USA',',')) 
    AND GBU.UserID IN (SELECT ID FROM VW_GBU_Search WHERE CONTAINS(*, 'COMPASS')) 
) 
SELECT * FROM results 
    WHERE rowNum BETWEEN 0 AND 25 

Кроме того, почему у вас есть предложение «1 = 1»? Вы можете устранить это?

0

Я ударил головой о стену по этой проблеме часами; здесь обходной путь:

ASSUME: A table in database called 
     Items (ItemId int PK, Content varchar(MAX)), 
     which has a fulltext index already applied. 

GO 
CREATE FUNCTION udf_SearchItemsTable(@FreeText) 
RETURNS @SearchHits 
TABLE(
    Relevance int, 
    ItemId int, 
    Content varchar(MAX) 
) 
AS 
BEGIN 
    INSERT @SearchHits 
    SELECT Results.[Rank] AS Relevance 
     ,Items.ItemId AS ItemId 
     ,Items.Content AS Content 
    FROM SearchableItems AS Items INNER JOIN 
     CONTAINSTABLE(SearchableItems, *, @FreeText) AS Results 
      Results.[Key] = Items.Id 
    RETURN 
END 
GO 
... 
GO 
CREATE FUNCTION udf_SearchItems(@SearchText, @StartRowNum, @MaxRows) 
RETURNS @SortedItems 
TABLE (
    ItemId int, 
    Content varchar(MAX) 
) 
AS 
BEGIN 
    WITH Matches AS 
    (
     SELECT 
      ROW_NUMBER() OVER (ORDER BY Hits.Relevance DESC) AS RowNum 
      ,Hits.* 
     FROM (udf_SearchItemsTable(@SearchText)) AS Hits 
    ) 
    SELECT 
     ItemId, Content 
    FROM 
     Matches 
    WHERE 
     Matches.RowNum BETWEEN @StartRowNum 
    AND @StartRowNum + @MaxRows 
    ; 
    RETURN 
END 
GO 


select * from udf_SearchItems('some free text stuff', 10, 20) 
Смежные вопросы