日期:2014-05-18  浏览次数:20475 次

关于cursor的一些问题
创建一个临时的测试表
CREATE TABLE #CursorTest
(Name varchar(50)
,ID int IDENTITY(1,1))

INSERT #CursorTest
(Name)
VALUES
('A'),('B'),('C'),('D'),('E'),('F'),('G')
-------------------------------------------
SELECT * FROM #CursorTest


DECLARE @MyName varchar(50)
  ,@MyID int
DECLARE Mycursor CURSOR FOR
SELECT * FROM #CursorTest
OPEN Mycursor
FETCH NEXT FROM Mycursor into @MyName,@MyID
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE #CursorTest SET Name=Name+'A'

WHERE ID=@MyID

/**************************************************************************

我的问题就在这里,正常结果输出是AA,BB,CC...,但是把这条语句去掉,结果显示为AAAAAAAA,
BAAAAAAA,...我不理解为什么语句执行到字母G的时候不中断,这不是已经到结果集的末尾了么,而且为什么它在本身的字母后面加到第七个A就不继续加下去了呢,是什么使它在这个时候停止的呢
*****************************************************************/
   

FETCH NEXT FROM Mycursor into @MyName,@MyID
END

------解决方案--------------------
CREATE TABLE #CursorTest
(Name varchar(50)
,ID int IDENTITY(1,1))

INSERT #CursorTest
(Name)
VALUES
('A'),('B'),('C'),('D'),('E'),('F'),('G')
-------------------------------------------
SELECT * FROM #CursorTest


DECLARE @MyName varchar(50)
,@MyID int
DECLARE Mycursor CURSOR FOR
SELECT * FROM #CursorTest
OPEN Mycursor
FETCH NEXT FROM Mycursor into @MyName,@MyID
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE #CursorTest SET Name=Name+@MyName

WHERE ID=@MyID

/**************************************************************************

我的问题就在这里,正常结果输出是AA,BB,CC...,但是把这条语句去掉,结果显示为AAAAAAAA,
BAAAAAAA,...我不理解为什么语句执行到字母G的时候不中断,这不是已经到结果集的末尾了么,而且为什么它在本身的字母后面加到第七个A就不继续加下去了呢,是什么使它在这个时候停止的呢
*****************************************************************/


FETCH NEXT FROM Mycursor into @MyName,@MyID
END
close Mycursor
deallocate Mycursor

select *from #CursorTest

/*
你要的是这个结果吗?
------------------------
Name ID
AA 1
BB 2
CC 3
DD 4
EE 5
FF 6
GG 7
*/