6

我执行一个选择语句。如果结果集中的行数小于或等于某个数字,则返回选定的行。如果行数大于某个数字,我想不返回任何行。

运行选择并进行比较后,如果行数大于允许的行数,我执行:

SELECT TOP 0 NULL AS ID

我发现,最初选择的两条记录也与第二个结果集一起返回,其中包含一个名为 ID 的列,没有记录。显然,最初的选择语句仍在返回,我想避免这种情况。有什么办法吗?

编辑:忘了补充说我需要返回一个状态值,指示是否有超过允许的行数。这意味着我必须进行计数,并且希望在不必运行相同查询两次的情况下进行计数。因此,如果允许的最大行数为 25,但实际存在零行,则返回状态 0。但如果行数大于 25,则不返回任何行,但将状态设置为 - 1.

4

3 回答 3

5

对临时表进行选择,检查表中的行数并在您的选择中使用临时表或返回 0 行。

-- Your query goes here
select ID
into #T
from YourTable
--where 

-- Check the number of rows returned
if (select count(*) from #T) <= 10
begin
  -- Return the data
  select ID
  from #T
end
else
begin
  -- Don't return anything
  select ID
  from #T
  where 0 = 1
end

drop table #T

您也可以在一个查询中使用count(*) over().

select ID
from
  (
    select ID, count(*) over() as C
    from YourTable
    --where
  ) T
where C <= 10

或使用 CTE

with C as
(
  select ID
  from YourTable
  --where
)
select ID
from C
where (select count(*) from C) <= 10

选择最适合您的需求或对您的数据表现最好的任何东西。

更新
返回行数的修改后的临时表版本。

declare @MaxRows int
set @MaxRows = 25

declare @ActualRowCount int

select top(@MaxRows+1) ID
into #T
from YourTable

set @ActualRowCount = @@rowcount

if @ActualRowCount = 0
begin
  -- No rows returned
  select null as ID, 0 as [RowCount]
end
else
if @ActualRowCount > @MaxRows
begin
  -- Too many rows returned
  select null as ID, -1 as [RowCount]
end
else
begin
  -- Return rows from temp table
  select ID, @ActualRowCount as [RowCount]
  from #T
end

drop table #T
于 2012-05-20T11:27:59.817 回答
1

我假设您使用的是 SQL Server,因此您可以使用@@ROWCOUNT(返回受最后一条语句影响的行数。)

所以这里有一个例子:

SELECT ID FROM [YourTable] WHERE [Your Conditions]

IF @@ROWCOUNT > [YourLimit]
  SELECT ID FROM [YourTable] WHERE 0=1 // return empty records
ELSE
  SELECT ID FROM [YourTable] WHERE [Your Conditions]

就这样

于 2012-05-20T15:00:42.330 回答
1

将行数参数加载到变量中,然后SELECT

DECLARE @rows INT;
DECLARE @maxRows INT = 1000; --set your desired max value here
SELECT @rows=COUNT(1) FROM [myTable];

SELECT ID FROM [myTable]
WHERE @rows <= @maxRows;

当行数过多时,您要么得到一个空集,要么得到结果集

于 2012-05-20T16:00:26.390 回答