代码之家  ›  专栏  ›  技术社区  ›  Ali Tarhini

sql 2008光标与sql2000的区别?

  •  1
  • Ali Tarhini  · 技术社区  · 16 年前

    以下代码在sql2008和sql2000上的运行方式存在差异。在sql 2000中,结果是正确的(从第一行到最后一行的提取是正常的),而在sql 2008中,提取显示出奇怪的行为(从最后插入的行开始到第一行)。以下是问题代码,其中“区域”是任意表格:

    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
    

    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 回复  |  直到 16 年前
        1
  •  4
  •   NetSide    16 年前

    如果在SQL2008中使用游标,它将从最后一个到第一个。没错,SQL更改了它的选择规则。一般来说,最好像这样使用游标。使用OrderBy。

        2
  •  1
  •   Ed Harper    16 年前

    您没有指定 ORDER BY

    SQL 2000和2008都是这种情况——行顺序与实际情况基本一致。

    我在SQL2008SP1上创建了一个测试,包括 订购人

    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