SQL Server 2008 CTE и CONTAINSTABLE Заявление - почему ошибка? - PullRequest
0 голосов
/ 28 ноября 2009

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

При использовании полнотекстового 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), инструкция выполняется нормально.

Бесполезная ошибка, которую я получаю, это:

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

Есть предложения?

Ответы [ 3 ]

1 голос
/ 29 ноября 2009

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

;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"? Вы можете устранить это?

1 голос
/ 28 ноября 2009

Кажется, это ошибка. Смотри http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=426981

Похоже, исправление должно быть в следующем MSSQL SP.

0 голосов
/ 23 июля 2010

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

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)
...