0

データベースを 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 行をコメントアウトすると、ステートメントが実行されます。(WITH ではなく) SELECT ステートメントのみを実行すると、ステートメントは正常に実行されます。

これで得られる役に立たないエラーは次のとおりです。

メッセージ 0、レベル 11、状態 0、行 0 現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。メッセージ 0、レベル 20、状態 0、行 0 現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。

助言がありますか?

4

3 に答える 3

1

他の回答が正しく、根本的な問題がバグであると仮定すると、CONTAINSTABLE から RANK を参照していないため、次のようなクエリが回避策になる可能性があります。ここで、「ID」は VW_GBU_Search (未テスト) の ID 列です。 )?

;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」節があるのですか? あなたはそれをなくすことができますか?

于 2009-11-29T04:03:41.203 に答える
1

バグのようです。http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=426981を参照してください。

修正は次の MSSQL SP にあるようです。

于 2009-11-28T15:00:00.450 に答える
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)
于 2010-07-23T08:24:49.580 に答える