0

我设置了搜索功能,可以同时运行多个查询。每个查询的前 1000 个结果将写入一个表。(这些运行异步——我只是省略了我用来执行此操作的代码)

Insert into Results
Select Top 1000 Text from A where Contains(Text,'"searchString"')

Insert into Results
Select Top 1000 Text from B where Contains(Text,'"searchString"')

Insert into Results
Select Top 1000 Text from C where Contains(Text,'"searchString"')

然后,我从该表中选择前 1000 个结果。

Select Top 1000 * from Results

是否有一种好方法可以在流程的早期任何时候有效地检查是否已经有 1000 个结果,如果有,则取消其他查询并尽快选择 1000 个结果。

4

4 回答 4

2

以下可能会为您提供一个计划,以实现您在找到第 1,000 行后不处理任何行的预期结果。

WITH CTE
     AS (SELECT Text
         FROM   A
         WHERE  CONTAINS(Text, '"searchString"')
         UNION ALL
         SELECT Text
         FROM   B
         WHERE  CONTAINS(Text, '"searchString"')
         UNION ALL
         SELECT Text
         FROM   C
         WHERE  CONTAINS(Text, '"searchString"'))
INSERT INTO Results
SELECT TOP 1000 Text
FROM   CTE 
于 2012-11-09T14:51:45.530 回答
1

如果您使用标识列设置结果表,则可以使用此查询实现目标(让“计数器”成为该列。不要忘记在其上放置索引)

declare @remaining int
select @remaining = 1000 - (max(counter) - min(counter) + 1) from result
if @result>0
  insert into Result (Text) select top (@remaining) Text from MyTable

此外,如果您有一个表名列表,则可以使用 while 循环并在 @result 为 0 时退出。

于 2012-11-11T09:33:00.367 回答
0

以下 SQL 将任何后续查询的行数限制为 4

设置行数 4

SET @Rows = @@ROWCOUNT

从前面的选择中获取行数

所以像

选择顶部等...

SET @Rows = @@ROWCOUNT

设置 ROWCOUNT 1000 - @Rows

如果@row 低于零,可能会出错

但是你用 IF 和 goto PROC_LABLE 来陷阱

于 2012-11-09T14:52:11.703 回答
0
insert into #tt2 
SELECT TOP 1000 [sID]
FROM [docSVsys]
where (select count(*) from #tt2) < 1000

但我仍然会使用 .NET 和 TPL。

这仍将处理所有表,但一旦达到 1000,它应该处理 0 行

于 2012-11-09T16:56:03.300 回答