2010-01-29 55 views
1

下面的代码在sql2008和sql2000上的运行方式是有区别的。在sql 2000中,结果是正确的(从第一行到最后一行的提取是正常的),而在sql 2008中,提取显示出奇怪的行为(从最后一个插入行开始,直到第一个行,下面是问题的代码其中, '区域' 是任何表:sql 2008光标与sql2000的区别?

create trigger tr on area for insert as 
    declare @id int 
    select @id = id from inserted 
    print 'trigger: ' + convert(varchar(50), @id) 

    declare c cursor scroll for select id from inserted order by id 
open c 
fetch next from c into @id 
while @@FETCH_STATUS = 0 
begin 
    print 'cursor id: ' + convert(varchar(50), @id) 
    fetch next from c into @id 
end 
close c 
deallocate c 
下面

是在SQL 2008的结果showig:

trigger: 1828 
cursor id: 1837 
cursor id: 1836 
cursor id: 1835 
cursor id: 1834 
cursor id: 1833 
cursor id: 1832 
cursor id: 1831 
cursor id: 1830 
cursor id: 1829 
cursor id: 1828 

和SQL 2000中显示的结果是:

trigger: 1837 
cursor id: 1828 
cursor id: 1829 
cursor id: 1830 
cursor id: 1831 
cursor id: 1832 
cursor id: 1833 
cursor id: 1834 
cursor id: 1835 
cursor id: 1836 
cursor id: 1837 

回答

4

如果使用小人或者在SQL2008中,它从最后到第一。你说得对,SQL改变了它的选择规则。一般来说,最好使用这样的游标。使用OrderBy。

+0

有没有一个选项,我可以设置使用它像SQL 2000的正常方式? – 2010-01-29 10:01:58

+1

我知道如何为您的选择语句添加“order by”。它适用于sql2000和sql2008。 – NetSide 2010-01-29 10:21:15

1

在定义游标的select语句中,您没有指定ORDER BY子句。没有ORDER BY,结果集中行的顺序是非确定性的。

SQL 2000和2008都是这种情况 - 行订单的方式本质上是巧合。

编辑

我创建了SQL 2008 SP1的测试,包括通过对第一编辑OP加ORDER BY条款,并不能复制所描述的行为:

create table area 
(id int) 
GO 
create trigger tr on area for insert as 
    declare @id int 
    select @id = id from inserted 
    print 'trigger: ' + convert(varchar(50), @id) 

    declare c cursor scroll for select id from inserted order by id 
open c 
fetch next from c into @id 
while @@FETCH_STATUS = 0 
begin 
    print 'cursor id: ' + convert(varchar(50), @id) 
    fetch next from c into @id 
end 
close c 
deallocate c 
GO 

insert area 
select 10 
union select 9 
union select 8 
union select 7 
union select 6 
union select 5 
union select 4 
union select 3 
union select 2 
union select 1 

我得到了以下结果

trigger: 1 
cursor id: 1 
cursor id: 2 
cursor id: 3 
cursor id: 4 
cursor id: 5 
cursor id: 6 
cursor id: 7 
cursor id: 8 
cursor id: 9 
cursor id: 10 
+0

这不是巧合 – 2010-01-29 10:08:02

+1

这或多或少是巧合。您依赖MS为此类操作选择的排序算法。这从来没有记录,也没有保证永远保持不变。显然现在MS已经改变了这个算法。如果你想保证你的代码不受任何底层引擎算法的影响,可以使用ORDER BY子句。 – 2010-01-29 10:36:27

+0

@Microgen - 我无法复制您在测试中描述的行为 – 2010-01-29 10:49:26