0

SQL Server 2005에서 2008로 데이터베이스 이동을 테스트하고 있습니다. 우리는 CTE를 페이징에 사용합니다.SQL Server 2008 CTE 및 CONTAINSTABLE 문 - 왜 오류입니까?

전체 텍스트 CONTAINSTABLE을 사용하면 CTE가 실행되지 않고 오류가 발생합니다. 나는 CONTAINSTABLE 줄을 주석으로 경우

여기 나의

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 

코드 - 비 작업의 명령문이 실행됩니다. SELECT 문 (WITH가 아닌) 만 실행하면 명령문이 올바르게 실행됩니다.

나는이에 얻는 않은 도움이 오류는 다음과 같습니다

메시지 0, 수준 11, 상태 0, 줄 0 A 심각한 오류가 현재 명령에 발생했습니다. 결과가있는 경우 을 버려야합니다. 메시지 0, 수준 20, 상태 0, 줄 0 현재 명령 에 심각한 오류가 발생했습니다. 결과가 이라면 버려야합니다.

의견이 있으십니까?

+0

SQL 문장과 같은 코드 행을 강조 표시 한 다음 편집기 툴바에서 "코드"버튼 (101 010)을 누르거나 키보드에서 Ctrl-K를 눌러야합니다. 멋지게 포맷하고 구문을 강조하는 코드 섹션! –

답변

1

CONTAINSTABLE에서 RANK를 참조하지 않아서 다른 답변이 정확하고 기본 문제가 버그라고 가정하면 다음과 같은 검색어가 해결 방법이 될 수 있습니다. 여기서 "ID"는 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"절이 있습니까? 그것을 없앨 수 있습니까?

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)