Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 排序FREETEXTTABLE结果与标准按等级选择联合_Sql_Sql Server_Full Text Search_Union_Freetexttable - Fatal编程技术网

Sql 排序FREETEXTTABLE结果与标准按等级选择联合

Sql 排序FREETEXTTABLE结果与标准按等级选择联合,sql,sql-server,full-text-search,union,freetexttable,Sql,Sql Server,Full Text Search,Union,Freetexttable,我有一个正在工作的FREETEXTTABLE查询,它搜索@searchString。我现在需要将其与另一个简单查询结合起来,该查询尝试将@searchString解析为INT,如果成功,则通过查找PK等于parse@searchString的行来过滤表 以前,我可以很容易地将FREETEXTTABLE结果连接到它正在搜索的表中,按排名排序,但只选择搜索的原始表的列 现在,我将文本搜索查询和以搜索字符串作为键查找行的查询之间的唯一结果组合在一起,我不再能够从文本搜索查询访问排名 如何维护全文搜索的

我有一个正在工作的FREETEXTTABLE查询,它搜索@searchString。我现在需要将其与另一个简单查询结合起来,该查询尝试将@searchString解析为INT,如果成功,则通过查找PK等于parse@searchString的行来过滤表

以前,我可以很容易地将FREETEXTTABLE结果连接到它正在搜索的表中,按排名排序,但只选择搜索的原始表的列

现在,我将文本搜索查询和以搜索字符串作为键查找行的查询之间的唯一结果组合在一起,我不再能够从文本搜索查询访问排名


如何维护全文搜索的排名顺序,但如果查询结果在全文搜索结果之前,则将查找主键行的查询结果放在该行的前面?

您是否尝试过向并集添加一个常量,将PK的精确匹配放在列表的顶部?我不记得自由文本排名列返回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

在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

我可以看出你的答案的有效性——从FREETEXTTABLE调用中提取连接,并在联合后使用它。不幸的是,我似乎无法让它解析SQL。这让我对“等级”和“关键”的用法产生了疑问。另外,如果@searchString不是有效的整数,CAST是否会引发异常?我最初有一个TRY-CATCH块来根据a convert调用是否成功设置一个值。如果cast失败了,那么我可以跳过它。你可以用一个case语句来包装联合的第二部分-我将更新示例以反映这一点。至于不解析查询-我不确定是什么导致了您的问题…我在运行测试查询时遇到了相同的解析问题。看起来它只需要将KEY&RANK列用括号括起来。更近一些。。。我修改了您的SQL,使[Rank]现在只对出于某种原因使用的所有大写字母进行排序,并且还声明了一个变量,并将其设置为try/catch块中的强制int值,因为即使存在十进制、+、-等,isnumeric也是true,这对整数无效。现在它正在解析SQL而没有错误。但是,它不会返回与作为主键值的searchString相对应的行。经过进一步测试,似乎将searchString转换为int可以正常工作,但只要我将其选择到MyFreetextCte中作为键值,该值就会从0或50之类的值更改,转换为类似于478400592的值。如果键是整数标识列,则用作键的数字是否会从根本上改变其表示方式?我以前从未见过这样的事。