'select top'返回太多行

时间:2017-02-28 10:50:59

标签: tsql

insert into
    @resultSet
SELECT TOP (@topN)  
    field1,
    field2
FROM    
    dbo.table1 DataLog  
WHERE           
    DataLog.SelectedForProcessing is null

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

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

这是预期的行为吗?

2 个答案:

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

TOP N为常量值时,SQL Server将始终返回N行 - 没有摆动空间。

我看到两种可能性:

  1. @topN偶尔获得不同的价值
  2. 在插入新值之前,
  3. @resultSet在某种程度上不是空的
  4. 如果@resultSet是在脚本中其他地方声明的变量,请检查是否有其他INSERT INTO语句可能会留下不必要的行。

    在运行时实现此功能的一种简单方法是在此INSERT INTO语句之前添加另一个命令:

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