سؤال

وكان لي استعلام FREETEXTTABLE العمل التي بحثت عن وsearchString. أنا الآن بحاجة إلى UNION أنه مع استعلام بسيط آخر يحاول تحليلsearchString إلى INT، وإذا نجحت، وتصفية الجدول من خلال البحث عن الصف مع PK يساويsearchString تحليل.

وفي السابق، وأنا يمكن بسهولة انضمام نتيجة FREETEXTTABLE إلى طاولة أنها كانت تبحث، أمر من رتبة، ولكن فقط حدد أعمدة الجدول الأصلي الذي تم تفتيشه.

والآن أنني الجمع بين نتائج فريدة من نوعها بين استعلام البحث عن النص والاستعلام تبحث عن خلاف مع سلسلة البحث كمفتاح، وأنا لم يعد لديك الوصول إلى رتبة من الاستعلام البحث عن النص.

وكيف يمكنني الحفاظ على ترتيب حسب الرتبة من البحث عن النص الكامل، ولكن وضع نتيجة الاستعلام تبحث عن خلاف مع المفتاح الأساسي (إذا كان لديه نتيجة لذلك) BEFORE نتائج البحث عن النص الكامل؟

هل كانت مفيدة؟

المحلول

ولقد حاولت فقط إضافة ثابت إلى نقابتكم أن يضع تطابق تام الخاص بك من PK على رأس القائمة؟ أنا لا أتذكر من على قمة رأسي ما يعود العمود FREETEXT RANK (0-1000 على ما أظن)، ولكن شيئا من هذا القبيل يعمل على افتراض أن لمجرد تقديم أعلى الخاص بك ثابت من أعلى رتبة.

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

نصائح أخرى

ومع من نصف طن من المساعدة من سكوت، وهذا هو ما قلته أن يعمل أخيرا:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top