100分 求教SQLSERVER中的用游标遍历表中的列并实现累加输出。

来源:百度知道 编辑:UC知道 时间:2024/06/22 02:56:31
下面的是我写的存储过程,有问题。
declare @id int
declare @name varchar(50)
declare @mysite int
set @mysite = 2
declare @finalname varchar(200)
set @finalname=''

DECLARE Employee_Cursor CURSOR FOR
SELECT site_id, site_name
FROM site_info
WHERE parent_site_id =@mysite

OPEN Employee_Cursor

FETCH NEXT FROM Employee_Cursor into @id,@name
set @finalname = @finalname + @name
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor into @id,@name
set @finalname = @finalname + @name
END

CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor
print @finalname

现在的问题就是,要先调用下面这句话,先去读一下游标
FETCH NEXT FROM Employee_Cursor into @id,@name
然后再根据读到的情况循环读取。
WHILE @@FETCH_STATUS = 0
这样会带来一个问题,最后一条记录的值会加二次。
现在我的权宜之计就是在循环结束之后把最后一条记录的相应值再减去。
但这样肯定不是正常的方案。
求教高手。
最佳的方案就是像ORacle一样,直接进入循环,而不是先要试取一条。
比较重要的就是如何不要放最后一个值加二次?
拜托各位了

你逻辑流程有问题 ,下面是你的逻辑流程,
读取下一条→加值→[判断是否结尾→读取下一条→加值](循环)
而@@FETCH_STATUS返回3种状态,
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在。

这样在游标移动到最后一行的时候,进行while判断@@FETCH_STATUS为0 ,进行一次加值,然后又直接进入while判断 这时候你还没有移动游标,@@FETCH_STATUS还是为0,又进行了一次加值,然后移动游标,进行判断@@FETCH_STATUS不为0,退出循环
所以应该修改逻辑为
读取下一条→[判断是否结尾→加值→读取下一条](循环)
SQL语句调整如下
===========================================
OPEN Employee_Cursor

FETCH NEXT FROM Employee_Cursor into @id,@name
WHILE @@FETCH_STATUS = 0
BEGIN
set @finalname = @finalname + @name
FETCH NEXT FROM Employee_Cursor into @id,@name
END
CLOSE Employee_Cursor
==================================
以上语句实测试通过

先移动游标,然后就开始判断,为真进行加值 然后移动游标,这样就没问题了,

FETCH NEXT FROM Employee_Cursor into @id,@name

WHILE @@FETCH_STATUS = 0
BEGIN
set @finalname = @finalname + @name
FETCH NEXT FROM Employee_Cursor into @id,@name
END