sql 2008 разница курсора с sql2000? - PullRequest
1 голос
/ 29 января 2010

есть разница между тем, как следующий код работает на sql2008 и sql2000. в SQL 2000 результат правильный (выборка нормальная от первой строки до последней строки), в то время как в SQL 2008 выборка показывает странное поведение (начинается с последней вставленной строки до первой. где 'area' - любая таблица:

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:

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

Ответы [ 2 ]

4 голосов
/ 29 января 2010

Если вы используете курсор в SQL2008, он становится последним и первым. Вы правы, SQL изменил свое правило выбора. В общем, лучше использовать курсор таким образом. Используйте OrderBy.

1 голос
/ 29 января 2010

Вы не указываете предложение ORDER BY в операторе выбора, которое определяет ваш курсор. Без ORDER BY порядок строк в наборе результатов является недетерминированным.

Это относится и к SQL 2000, и к 2008 году - по сути, это совпадение того, что порядок строк такой, какой они есть.

EDIT

Я создал тест на SQL 2008 с пакетом обновления 1 (SP1), включая предложение ORDER BY, добавленное OP при первом редактировании, и не могу воспроизвести описанное поведение:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...