Frage

Ich hatte eine Arbeits Abfrage, die FREETEXTTABLE für eine @searchString gesucht. Ich brauche jetzt UNION, dass mit einer anderen einfachen Abfrage, die die @searchString in einen INT zu analysieren versucht, und wenn es gelingt, Filtrieren die Tabelle, indem sie mit PK gleich die Parse @searchString für die Zeile suchen.

Bisher kann ich einfach das Ergebnis FREETEXTTABLE auf den Tisch JOIN es war auf der Suche, um durch die Rank, sondern nur die Spalten der ursprünglichen Tabelle auswählen, die durchsucht wurde.

Nun, da ich die einzigartigen Ergebnisse zwischen der Textsuchabfrage am Kombinieren und die Abfrage für die Zeile mit dem Suchbegriff als Schlüssel suchen, ich habe keinen Zugriff mehr auf den Rang von der Textsuchabfrage.

Wie kann ich die Bestellung von Rang der Volltextsuche erhalten, aber das Abfrageergebnis Platz für die Zeile mit dem Primärschlüssel suchen, bevor die Volltextsuche Ergebnisse (wenn es ein Ergebnis hat)?

War es hilfreich?

Lösung

Haben Sie versucht, nur eine Konstante Ihre Vereinigung hinzuzufügen, die Ihre genaue Übereinstimmung der PK auf der Spitze der Liste setzt? Ich habe nicht die Spitze von meinem Kopf erinnern, wer oder was der Freitext RANK Spalte zurückkehrt (0-1000 glaube ich), aber so etwas wie dies unter der Annahme, funktionieren wurde, dass Sie gerade Ihre konstant machen höher als die Spitze des Ranges.

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

Andere Tipps

mit einer Tonne Hilfe von Scott, das ist, was ich habe, dass endlich funktioniert:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top