2010-01-29 88 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