문제

@SearchString을 검색하는 Weking FreetextTable 쿼리가있었습니다. 이제 @SearchString을 INT로 구문 분석하려고 시도하는 또 다른 간단한 쿼리로이를 통합해야하며 성공하면 PK로 행을 파스 @SearchString과 동일한 행을 찾아 테이블을 필터링해야합니다.

이전에는 검색중인 테이블에 freetexttable 결과를 쉽게 가입하고 순위별로 주문할 수 있었지만 검색 된 원래 테이블의 열만 선택할 수있었습니다.

이제 텍스트 검색 쿼리와 쿼리 사이의 고유 한 결과를 Key로 검색 문자열로 찾는 행을 찾는 쿼리 사이의 고유 한 결과를 결합 했으므로 텍스트 검색 쿼리에서 더 이상 순위에 액세스 할 수 없습니다.

전체 텍스트 검색의 순위별로 주문을 어떻게 유지할 수 있지만, 전체 텍스트 검색 결과 전에 기본 키 (결과가있는 경우)가있는 행을 찾는 쿼리 결과를 배치 할 수 있습니까?

도움이 되었습니까?

해결책

PK의 정확한 일치를 목록 위에 올리는 연합에 상수를 추가하려고 시도 했습니까? 나는 내 머리 꼭대기에서 freetext 순위 열이 반환하는 것을 기억하지 못하지만 (0 Thru 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

다른 팁

Scott의 많은 도움으로 이것이 내가 마침내 작동하는 것입니다.

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