2009-07-29 4 views
1

J'ai eu une requête FREETEXTTABLE en cours de recherche qui a recherché un @searchString. J'ai maintenant besoin de UNION avec une autre requête simple qui essaye d'analyser le @searchString dans un INT, et si cela réussit, de filtrer la table en cherchant la ligne avec PK égale à l'analyse @searchString.Commande du résultat FREETEXTTABLE RACCORDÉ avec la norme SELECT par rang

Auparavant, je pouvais facilement JOINDRE le résultat FREETEXTTABLE à la table qu'il cherchait, classer par rang, mais seulement CHOISIR les colonnes de la table d'origine qui a été recherchée. Maintenant que je combine les résultats uniques entre la requête de recherche de texte et la requête recherchant la ligne avec la chaîne de recherche comme clé, je n'ai plus accès au classement de la requête de recherche de texte.

Comment puis-je gérer la classification par rang de la recherche en texte intégral, mais placer le résultat de la recherche à la recherche de la ligne avec la clé primaire (si elle a un résultat) AVANT les résultats de recherche en texte intégral?

Répondre

0

Avez-vous essayé d'ajouter simplement une constante à votre union qui met votre correspondance exacte du PK en haut de la liste? Je ne me souviens pas de ce que la colonne Freetext RANK renvoie (0 à 1000 je crois), mais quelque chose comme ça fonctionnerait en supposant que vous faites juste votre constante supérieure au sommet du rang.

DECLARE @id int 

IF ISNUMERIC(@myStringId) = 1 
    SET @id = CAST(@myStringId AS int) 
ELSE 
    SET @id = 0 

WITH MyFreetextCte as (SELECT [Rank], 
           [Key] 
         FROM  FREETEXTTABLE(...) 
         UNION 
         SELECT 1001, 
           (SELECT MyBaseTable.PK FROM MyBaseTable WHERE PK = @id)) 
SELECT * 
FROM  MyFreetextCte JOIN MyBaseTable ON MyFreetextCte.[Key] = MyBaseTable.PK 
ORDER BY MyFreetextCte.Rank DESC 
+0

Je peux voir la validité de votre réponse-- tirant la jointure loin de l'appel à l'aide et FREETEXTTABLE * après * l'UNION. Malheureusement, je n'arrive pas à l'obtenir pour analyser le SQL. Il me donne des problèmes avec l'utilisation de «Rank» et «Key». De même, si @searchString n'est pas un nombre entier valide, CAST déclenchera-t-il une exception? À l'origine, j'avais un bloc TRY CATCH pour définir une valeur en fonction du succès de l'appel de conversion. Si la distribution échoue gracieusement alors je peux simplement sauter ça. – Brandon

+0

vous pourriez envelopper cette 2ème partie de l'union avec une déclaration de cas - je mettrai à jour l'exemple pour refléter cela. Quant à ne pas analyser la requête - je ne suis pas sûr de ce qui causerait vos problèmes là ... –

+0

J'ai eu les mêmes problèmes d'analyse en cours d'exécution d'une requête de test. On dirait qu'il faut juste que les colonnes KEY & RANK soient accolées. –

0

une tonne d'aide de Scott, voici ce que j'ai qui fonctionne enfin:

CREATE PROCEDURE dbo.testProcedure 
(
    @searchPhrase nvarchar(500) 
) 

AS 

DECLARE @id int 
SET @id = 0; 
BEGIN TRY 
    SET @id = CAST(@id AS int) 
END TRY 
BEGIN CATCH 
END CATCH; 
-- at this point, @id will be the primary key if it is only digits 
-- otherwise it will default to zero (which is out of range of my identity PK) 

WITH ftsTable AS (
    SELECT RANK, [KEY] FROM FREETEXTTABLE(sourceTable, *, @searchPhrase) 
    UNION 
    SELECT 1001, (SELECT sourceTableID FROM sourceTable WHERE sourceTableID = @id) 
) 

SELECT sourceTable.* 
FROM ftsTable JOIN sourceTable ON ftsTable.[KEY] = sourceTable.sourceTableID 
ORDER BY ftsTable.RANK DESC 
Questions connexes