0

Je suis en train de tester le déplacement de notre base de données de SQL Server 2005 à 2008. Nous utilisons des CTE pour la pagination. Lors de l'utilisation du texte intégral CONTAINSTABLE, le moteur CTE ne s'exécute pas et génère une erreur.Déclaration SQL Server 2008 CTE et CONTAINSTABLE - Pourquoi l'erreur?

Voici mon travail non code-

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 

Si je commente la ligne CONTAINSTABLE, l'exécution d'une instruction. Si je n'exécute que l'instruction SELECT (pas le WITH), l'instruction s'exécute correctement.

L'erreur non utile je reçois à ce sujet est:

Msg 0, niveau 11, état 0, ligne 0 Une erreur grave produite sur la commande actuelle. Les résultats, le cas échéant, doivent être ignorés. Msg 0, niveau 20, état 0, ligne 0 Une erreur grave s'est produite sur la commande en cours. Les résultats, si tout, doivent être jetés.

Des suggestions?

+0

vous devez mettre en évidence les lignes de code (comme votre instruction SQL) puis appuyez sur le bouton « code » (101 010) sur la barre d'outils de l'éditeur (ou appuyez sur Ctrl-K de votre clavier) pour bien mettre en forme et syntaxe mettre en évidence ces sections de code! –

Répondre

1

En supposant que les autres réponses sont correctes, et que le problème sous-jacent est un bogue, puisque vous ne faites pas référence à RANK à partir de CONTAINSTABLE, une requête comme celle-ci serait une solution de contournement. dans VW_GBU_Search (non testé)?

;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 

Aussi, pourquoi avez-vous la clause "1 = 1"? Pouvez-vous l'éliminer?

0

J'ai cogné ma tête contre le mur sur ce problème pendant des heures; voici une solution:

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)