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行)
这是预期的行为吗?
答案 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
行 - 没有摆动空间。
我看到两种可能性:
@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
;