dll*_*ell 3 t-sql sql-server cursor
在SQL Server上迭代游标时如何知道最后一行?
我已经尝试使用counter和@@CURSOR_ROWSand @@FETCH_STATUS,但是它不能很好地工作,或者我没有以正确的方式使用它们。
编辑:
好吧,是的,,在每个循环的末尾用逗号组成字符串。当然,在返回之前我可以切断最后一个字符,,但我想知道这是唯一的方法吗?
但是,在很多情况下,最好知道如何识别最后一行。
如评论中所建议,通过对第一行而不是最后一行进行特殊处理,可以更轻松地在元素之间添加逗号。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中不得已的常规警告,除非或直到事实证明游标不足,否则使用基于集合的方法。
| 归档时间: |
|
| 查看次数: |
9039 次 |
| 最近记录: |