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