“选择顶部”返回太多行

问题描述 投票:0回答:3
insert into
    @resultSet
SELECT TOP (@topN)  
    field1,
    field2
FROM    
    dbo.table1 DataLog  
WHERE           
    DataLog.SelectedForProcessing is null

我将

300
传递到上面 sql 中的
@topN
中,这是我在 app.config 文件中配置的一个值,但是在 2 个不同服务器上运行的此查询在一个实例中返回 304 行,在一个实例中返回 307 行另一个例子。

我找不到任何可能干扰300的地方,将其变成304或307,所以我开始怀疑SQL Server有时是否会只返回一些额外的行? (另一台服务器上的相同代码返回预期的 300 行)

这是预期的行为吗?

t-sql
3个回答
2
投票

测试一下

declare @topN int = 100;
select @topN ;
delete * from @resultSet;
insert into
    @resultSet
SELECT TOP (@topN)  
    field1,
    field2
FROM    
    dbo.table1 DataLog  
WHERE           
    DataLog.SelectedForProcessing is null;
select count(*) 
FROM    
dbo.table1 DataLog  
WHERE           
    DataLog.SelectedForProcessing is null;
select count(*) from @resultSet;

1
投票

TOP N

 是常量值时,SQL Server 将始终返回 
N
 行 - 没有回旋空间。

我看到两种可能性:

  1. @topN
     有时会获得不同的值
  2. @resultSet
     在插入新值之前不为空
如果

@resultSet

 是在脚本中其他地方声明的变量,请检查是否没有其他 
INSERT INTO
 语句可能留下不必要的行。

在运行时实现此功能的一种简单方法是简单地在此

INSERT INTO

 语句之前添加另一个命令:

DELETE @resultSet; INSERT INTO @resultSet SELECT TOP (@topN) field1, field2 FROM dbo.table1 DataLog WHERE DataLog.SelectedForProcessing IS NULL ;
    

0
投票
我也遇到了同样的问题。选择中包含 2 个文本和 1 个日期属性。首先对日期进行降序排序 - 而不是 25 行,我有 31 行。对日期升序排序,我有 110 行而不是 25 行。在 SQL Server 上,它符合预期......始终是 TOP x 的数量。 在 MS Access 中,我必须将所有选择字段添加到 order 子句中,以获得具体的数字。 看起来结果中的其他日期与 25 日相同..

© www.soinside.com 2019 - 2024. All rights reserved.