DECLARE @MyCursor CURSOR;
SET @MyCursor = CURSOR SCROLL STATIC FOR
SELECT au_fname + ' ' + au_lname AS Name,
city,state FROM authors;
OPEN @MyCursor;
FETCH NEXT FROM @MyCursor INTO @Name,@City,@State;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @Name + '在' + @City + '工作';
FETCH NEXT FROM @MyCursor INTO @Name,@City,@State;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
SQL Server游标变量声明和使用
在SQL Server中,游标变量通过DECLARE语句声明,类型为CURSOR。例如:DECLARE @mycursor CURSOR。接着使用SET语句赋值,指定游标类型如FORWARD_ONLY、SCROLL等,以及SELECT语句定义结果集。游标操作包括OPEN打开、FETCH读取行、CLOSE关闭、DEALLOCATE释放。
数据库游标工作原理
数据库游标是一种数据库对象,它允许应用程序逐行处理SQL语句的结果集,而不需要将整个结果集加载到客户端内存。SQL Server的游标基于临时表或服务器端快照实现,支持静态游标(数据不可变)、动态游标(反映数据变化)等类型。原理是通过维护一个指向结果集当前行的指针,逐行获取数据。
游标应用实例:统计每个作者的书数
DECLARE pubcursor CURSOR FOR
SELECT pub_name FROM publishers;
DECLARE @pub_name varchar(40), @count int;
OPEN pubcursor;
FETCH NEXT FROM pubcursor INTO @pub_name;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @count = COUNT(*) FROM titles t, publishers p
WHERE t.pub_id = p.pub_id AND p.pub_name = @pub_name;
PRINT @pub_name + '出版了' + CAST(@count AS varchar) + '本书';
FETCH NEXT FROM pubcursor INTO @pub_name;
END;
CLOSE pubcursor;
DEALLOCATE pubcursor;
游标变量类型详解
SQL Server支持多种游标类型:GLOBAL(全局可见)、LOCAL(局部)、STATIC(静态快照)、KEYSET(键集)、DYNAMIC(动态)。声明时如:DECLARE mycursor CURSOR LOCAL STATIC FOR SELECT * FROM table。变量游标允许将游标赋值给另一个CURSOR变量,实现传递。
游标优缺点和性能注意
游标原理是服务器端逐行处理,避免大结果集传输,但性能低于集合操作。应用场景:逐行复杂逻辑处理,如更新基于条件。实例中常用于报表生成或数据迁移,避免内存溢出。
完整游标存储过程示例
CREATE PROCEDURE GetEmployeeNames
AS
DECLARE empcursor CURSOR FOR
SELECT LastName, FirstName FROM Employees;
DECLARE @LastName nvarchar(50), @FirstName nvarchar(50);
OPEN empcursor;
FETCH NEXT FROM empcursor INTO @LastName, @FirstName;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @LastName + ', ' + @FirstName AS EmployeeName;
FETCH NEXT FROM empcursor INTO @LastName, @FirstName;
END
CLOSE empcursor;
DEALLOCATE empcursor;
FAQ
Q: 游标变量必须先声明再赋值吗?
A: 是的,先DECLARE CURSOR,再SET赋值。
Q: @@FETCH_STATUS的值是什么意思?
A: 0表示成功,-1表示结束,-2表示未执行。
Q: 游标可以用在函数中吗?
A: 否,游标仅限存储过程和批处理。
Q: 如何避免游标性能问题?
A: 优先用集合操作,如UPDATE FROM。