2010-01-29 1 views
1

다음 코드가 sql2008 및 sql2000에서 실행되는 방식에는 차이가 있습니다. SQL 2000에서 결과는 정확합니다 (페치는 첫 번째 행에서 마지막 행까지 정상입니다). 반면 sql 2008에서는 가져온 것이 이상한 동작을 보입니다. (마지막으로 삽입 된 행에서 첫 번째 행까지 시작합니다. 아래 코드는 문제의 코드입니다. 아래 sql200과 sql2002 커서 차이점은 무엇입니까?

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과 같은 일반적인 방법으로 설정할 수있는 옵션이 있습니까? –

+1

select 문에 "order by"를 추가하는 방법을 알고 있습니다. 그것은 sql2000 및 sql2008에서도 작동합니다. – NetSide

1

커서를 정의하는 select 문에 ORDER BY 절을 지정하지 마십시오. ORDER BY이 없으면 결과 집합의 행 순서는 비 결정적입니다.

이것은 SQL 2000과 2008 모두에 해당됩니다. 행 순서가 원래 그대로라는 것은 우연의 일치입니다.

편집

은 내가 먼저 편집에 OP에 의해 추가 된 ORDER BY 절을 포함한 SQL 2008 SP1에서 테스트를 작성하고 설명 동작을 복제 할 수 없습니다 :

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

이것은 우연이 아닙니다 –

+1

그것은 다소 우연의 일치입니다. 이 유형의 작업에 대해 선택 한 정렬 알고리즘에 의존했습니다. 이것은 결코 문서화되지 않았으며 영원히 동일하게 유지 될 것이라고 보장되지 않았습니다. 분명히 MS는 지금이 알고리즘을 변경했습니다. 기본 엔진 알고리즘의 영향을받지 않도록 코드를 유지하려면 ORDER BY 절을 사용하십시오. –

+0

@Microgen - 테스트에서 설명하는 동작을 복제 할 수 없습니다. –

관련 문제