insert into
@resultSet
SELECT TOP (@topN)
field1,
field2
FROM
dbo.table1 DataLog
WHERE
DataLog.SelectedForProcessing is null在上面的sql中,我将300传递给@topN,这个值是我在app.config文件中配置的,但是这个在两个不同服务器上运行的查询在一个实例中返回了304行,在另一个实例中返回了307行。
我找不到任何地方可能会干扰300,把它变成304或307,所以我开始怀疑SQL Server有时会不会返回几个额外的行?(另一台服务器上的相同代码返回预期的300行)
这是预期的行为吗?
发布于 2017-03-01 04:32:42
测试一下这个
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;发布于 2017-02-28 20:43:36
当N是常量值时,SQL Server将一致地返回TOP N行-那里没有回旋余地。
我认为有两种可能性:
@topN正在获取不同的值occasion@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
;https://stackoverflow.com/questions/42506718
复制相似问题