SQL异步多个查询组合结果 - 最大结果(顶部XYZ)

时间:2012-11-09 14:45:24

标签: sql-server-2008 tsql

我设置了搜索功能,同时运行多个查询。每个查询的前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 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

如果您使用标识列设置结果表,则可以使用此查询实现目标(让'counter'成为该列。不要忘记在其上添加索引)

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时退出。

答案 2 :(得分:0)

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

SET ROWCOUNT 4

SET @Rows = @@ ROWCOUNT

从前面的选择中获取行数

类似

SELECT TOP等......

SET @Rows = @@ ROWCOUNT

SET ROWCOUNT 1000 - @Rows

如果@row低于零

,可能会出错

但你用IF和goto PROC_LABLE

来陷阱

答案 3 :(得分:0)

insert into #tt2 
SELECT TOP 1000 [sID]
FROM [docSVsys]
where (select count(*) from #tt2) < 1000

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

这仍将处理所有表,但一旦达到1000

,它应处理0行