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 行)
这是预期的行为吗?
测试一下
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;
TOP N
是常量值时,SQL Server 将始终返回
N
行 - 没有回旋空间。我看到两种可能性:
@topN
有时会获得不同的值
@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
;