在SQL Server上迭代游标时如何知道最后一行?

dll*_*ell 3 t-sql sql-server cursor

在SQL Server上迭代游标时如何知道最后一行?

我已经尝试使用counter和@@CURSOR_ROWSand @@FETCH_STATUS,但是它不能很好地工作,或者我没有以正确的方式使用它们。

编辑:

好吧,是的,,在每个循环的末尾用逗号组成字符串。当然,在返回之前我可以切断最后一个字符,,但我想知道这是唯一的方法吗?

但是,在很多情况下,最好知道如何识别最后一行。

Dam*_*ver 5

如评论中所建议,通过对第一行而不是最后一行进行特殊处理,可以更轻松地在元素之间添加逗号。1,2

而不是

WHILE @@FETCH_STATUS=0
BEGIN
    SET @value = @value + @newelement + ','

    ...
END
Run Code Online (Sandbox Code Playgroud)

并尝试找出如何特别处理最后一行,这容易得多:

SET @first = 1
WHILE @@FETCH_STATUS=0
BEGIN
    IF @first = 1
        SET @first = 0
    ELSE
        SET @value = @value + ','

    SET @value = @value + @newelement

    ...
END
Run Code Online (Sandbox Code Playgroud)

如果您确实确实需要为最后一行做某事,另一种转换是使用中间变量和非标准的游标循环:

declare boris cursor for select top 10 name from sys.objects order by name

declare @name sysname
declare @nametemp sysname

open boris
fetch next from boris into @nametemp
while @@FETCH_STATUS=0
BEGIN
    set @name = @nametemp --Use SELECT if multiple variables to be assigned

    fetch next from boris into @nametemp

    if @@FETCH_STATUS!=0
    begin
        print 'and finally'
    end

    print @name
END

close boris
deallocate boris
Run Code Online (Sandbox Code Playgroud)

哪个打印出来(对我来说,在一个几乎空的数据库中):

EventNotificationErrorsQueue
filestream_tombstone_2073058421
filetable_updates_2105058535
IsIt
QueryNotificationErrorsQueue
queue_messages_1977058079
queue_messages_2009058193
queue_messages_2041058307
ServiceBrokerQueue
and finally
sysallocunits
Run Code Online (Sandbox Code Playgroud)

但我强烈建议您改用第一种类型的转换。


1这也不只是T-SQL的事情。在大多数编程语言中,如果您可以将问题从“以不同的方式处理最后一个迭代”转换为“以不同的方式处理第一次迭代”,通常会容易得多。

2当然,插入关于游标在SQL中不得已的常规警告,除非或直到事实证明游标不足,否则使用基于集合的方法。