Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql “选择顶部”返回的行太多_Tsql - Fatal编程技术网

Tsql “选择顶部”返回的行太多

Tsql “选择顶部”返回的行太多,tsql,Tsql,我在上面的sql中将300传递到@topN,这是我在app.config文件中配置的值,但是在两个不同服务器上运行的这个查询在一个实例中返回了304行,在另一个实例中返回了307行 我找不到任何可能干扰300的地方,将其转换为304或307,所以我开始怀疑SQL Server有时是否会返回一些额外的行?另一台服务器上的相同代码正在返回预期的300行 这是预期的行为吗?当N是一个常量值时,SQL Server将始终返回前N行-没有回旋余地 我认为有两种可能性: @topN有时会得到不同的值 @在插

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

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


这是预期的行为吗?

当N是一个常量值时,SQL Server将始终返回前N行-没有回旋余地

我认为有两种可能性:

@topN有时会得到不同的值 @在插入新值之前,resultSet不知何故不是空的 如果@resultSet是脚本中其他地方声明的变量,请检查其他INSERT INTO语句是否会留下不必要的行

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

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

当N是一个常量值时,SQL Server将始终返回前N行-没有回旋余地

我认为有两种可能性:

@topN有时会得到不同的值 @在插入新值之前,resultSet不知何故不是空的 如果@resultSet是脚本中其他地方声明的变量,请检查其他INSERT INTO语句是否会留下不必要的行

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

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

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

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

Sql不会返回额外的行,使用探查器检查Sql在早上不方便的时间运行@topNit时得到的值,测试运行按预期工作,其他服务器上的相同代码按预期工作。comSql不会返回额外的行,请使用探查器检查sql在早上不方便的时间运行@topNit时得到的值,测试运行按预期工作,其他服务器上的相同代码按预期工作。困惑。谢谢你采纳我的删除建议,谢谢你聪明的评论。向上投票:-感谢您采纳我的删除建议,以及您的明智评论。向上投票:-@3BK在存储过程的每次调用中都声明@resultSet变量,因此其中肯定没有预填充的数据,并且您肯定@topN是300?如果是这样,我想我帮不了你。。。如评论中所述,如果行数不够,可以选择减少行数;但排得过多则是另一回事。你问题中的问题是否准确?您在SELECT语句中是否使用了其他关键字,如TIES?@3BK。select有一个额外的where子句,就是关于它的,为了简单起见被删除了。由于不同服务器上的同一配置返回不同的行,这确实让我感到困惑,因为互联网以前可能听说过这种情况。我已经仔细检查了代码,值直接来自配置文件,除非在app.config中转换字符串只会增加几天。i、 e.300在某些天==304,在其他天==300?因为这就是正在发生的事情。然后一些服务器每天运行300分钟。只是有点奇怪。@3BK,明白了。我选择topN,然后使用这些行来更新SelectedForProcessing列,但有些记录有重复的键,因此300行正在更新304,这根本不是最重要的问题。不应该有重复的,但那完全是另一个问题。@Nnoel我很高兴你发现了它,我不得不说,我并不惊讶它最终会出现在其他地方;如上所述,总体而言,TOP具有非常可预测的行为。希望我们能帮上忙:祝你过得愉快@3BK@resultSet变量是在存储过程的每次调用中声明的,因此其中肯定没有预填充的数据,您肯定@topN是300?如果是这样,我想我帮不了你。。。如评论中所述,如果行数不够,可以选择减少行数;但排得过多则是另一回事。你问题中的问题是否准确?您在SELECT语句中是否使用了其他关键字,如TIES?@3BK。select有一个额外的where子句,就是关于它的,为了简单起见被删除了。由于不同服务器上的同一配置返回不同的行,这确实让我感到困惑,因为互联网以前可能听说过这种情况。我已经仔细检查了代码,值直接来自配置文件,除非在app.config中转换字符串只会增加几天。i、 e.300在某些天==304,在其他天==300?因为这就是正在发生的事情。然后一些服务器每天运行300分钟。只是有点奇怪。@3BK,明白了。我选择topN,然后使用这些行来更新SelectedForProcessing列,但有些记录有重复的键,因此300行正在更新304,这根本不是最重要的问题。不应该有重复的,但那完全是另一个问题。@Nnoel我很高兴 你发现了,我不得不说,我并不惊讶它最终会出现在其他地方;如上所述,总体而言,TOP具有非常可预测的行为。希望我们能帮上忙:祝你过得愉快!