sqlserver-游标

博客介绍了游标是处理数据的一种方法,它能在结果集中逐行或多行前后浏览数据,类似程序中循环读取数据做业务处理。还给出了建表和游标写法的示例。

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
其实应用更多时候是给我对多条数据处理, 情况有点类在程序中写循环读取数据后做业务处理,废话不多说,上代码
1,建表

 CREATE TABLE [dbo].[test3](
    	[keyid] [int] IDENTITY(1,1) NOT NULL,
    	[sort] [varchar](10) NULL,
    	[qty] [int] NULL,
    	[aaa] [nvarchar](max) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

2,游标写法

declare  @keyid int, @sort varchar(10),@qty int  

DECLARE My_Cursor CURSOR --定义游标
FOR (SELECT keyid, sort, qty  FROM [dbo].[test]   ) --查出需要的集合放到游标中,
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO  @keyid, @sort,@qty  --读取第一行数据,名字和类型要和原表相同
WHILE @@FETCH_STATUS = 0  
    BEGIN
       
	---do something,
	   
	FETCH NEXT FROM My_Cursor INTO  @keyid, @sort,@qty; --读取下一行数据 
    END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
出现 游标已存在问题 采用try的方式处理下,如果游标在存过里面执行,try也防止进去
BEGIN TRY
	 --exec [dbo].[P_GetMMD_ZJC] '2023-05-03 00:00:00','2023-05-04 00:00:00'   
END TRY
BEGIN CATCH
	--My_Cursor 为创建游标名称
	IF CURSOR_STATUS('global','My_Cursor')!=-3 OR CURSOR_STATUS('local','My_Cursor')!=-3
	BEGIN
  		 --释放游标
		DEALLOCATE My_Cursor;
	END 
END CATCH

比较简单,欢迎指教!

测试3条数据 CREATE TABLE test_main ( id INT, value VARCHAR(10), PRIMARY KEY(id) ); INSERT INTO test_main(id, value) VALUES (1, 'ONE'); INSERT INTO test_main(id, value) VALUES (2, 'TWO'); INSERT INTO test_main(id, value) VALUES (3, 'THREE'); 简单循环处理 DECLARE @id INT, @value VARCHAR(10); BEGIN -- 定义游标. DECLARE c_test_main CURSOR FAST_FORWARD FOR SELECT id, value FROM test_main; -- 打开游标. OPEN c_test_main; --填充数据. FETCH NEXT FROM c_test_main INTO @id, @value; --假如检索到了数据,才处理. WHILE @@fetch_status = 0 BEGIN PRINT @value; --填充下一条数据. FETCH NEXT FROM c_test_main INTO @id, @value; END; -- 关闭游标 CLOSE c_test_main; --释放游标. DEALLOCATE c_test_main; END; go ONE TWO THREE 用于更新的游标 DECLARE @id INT, @value VARCHAR(10); BEGIN --定义游标. DECLARE c_test_main CURSOR FOR SELECT id, value FROM test_main FOR UPDATE; --打开游标. OPEN c_test_main; --填充数据. FETCH NEXT FROM c_test_main INTO @id, @value; --假如检索到了数据,才处理. WHILE @@fetch_status = 0 BEGIN PRINT @value; --更新数据. UPDATE test_main SET value = value + '1' WHERE CURRENT OF c_test_main; --填充下一条数据. FETCH NEXT FROM c_test_main INTO @id, @value; END; --关闭游标 CLOSE c_test_main; --释放游标. DEALLOCATE c_test_main; END; go ONE (1行受影响) TWO Three SELECT * FROM test_main; go id value ----------- ---------- 1 ONE1 2 TWO1 3 Three1 (3 行受影响) 支持来回滚动的游标 注:这里为了测试,将 test_main 表的数据,增加至11条。 DECLARE @id INT, @value VARCHAR(10); BEGIN -- 定义游标. DECLARE c_test_main CURSOR SCROLL FOR SELECT id, value FROM test_main; -- 打开游标. OPEN c_test_main; -- 填充数据. FETCH FIRST FROM c_test_main INTO @id, @value; PRINT '游标中的第一行:' + @value; -- 填充数据. FETCH LAST FROM c_test_main INTO @id, @value; PRINT '游标中的最后一行:' + @value; -- 填充数据. FETCH ABSOLUTE 3 FROM c_test_main INTO @id, @value; PRINT '游标中的第3行[绝对地址]:' + @value; -- 填充数据. FETCH RELATIVE -2 FROM c_test_main INTO @id, @value; PRINT '游标中的第-2行[相对地址]:' + @value; -- 填充数据. FETCH PRIOR FROM c_test_main INTO @id, @value; PRINT '游标中的上一行:' + @value; -- 填充数据. FETCH NEXT FROM c_test_main INTO @id, @value; PRINT '游标中的下一行:' + @value; -- 关闭游标 CLOSE c_test_main; -- 释放游标. DEALLOCATE c_test_main; END; go 小结 SQL-92语法 DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] Transact-SQL扩展语法 DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
虽然提供的引用中未直接给出 SQL Server 双层游标示例代码,但可以根据对 SQL Server 游标的理解给出示例。以下是一个简单的 SQL Server 双层游标示例,该示例假设存在两个表`OuterTable`和`InnerTable`,外层游标遍历`OuterTable`的每一行,内层游标根据外层游标的当前行数据去遍历`InnerTable`的相关行: ```sql -- 声明外层游标变量 DECLARE OuterCursor CURSOR FOR SELECT OuterColumn1, OuterColumn2 FROM OuterTable; -- 声明外层游标使用的变量 DECLARE @OuterValue1 INT, @OuterValue2 VARCHAR(50); -- 打开外层游标 OPEN OuterCursor; -- 获取外层游标第一行数据 FETCH NEXT FROM OuterCursor INTO @OuterValue1, @OuterValue2; -- 外层游标循环 WHILE @@FETCH_STATUS = 0 BEGIN -- 声明内层游标变量 DECLARE InnerCursor CURSOR FOR SELECT InnerColumn1, InnerColumn2 FROM InnerTable WHERE SomeColumn = @OuterValue1; -- 声明内层游标使用的变量 DECLARE @InnerValue1 INT, @InnerValue2 VARCHAR(50); -- 打开内层游标 OPEN InnerCursor; -- 获取内层游标第一行数据 FETCH NEXT FROM InnerCursor INTO @InnerValue1, @InnerValue2; -- 内层游标循环 WHILE @@FETCH_STATUS = 0 BEGIN -- 这里可以进行内层游标当前行数据的处理,例如打印 PRINT 'Outer Value: ' + CAST(@OuterValue1 AS VARCHAR(10)) + ', Inner Value: ' + CAST(@InnerValue1 AS VARCHAR(10)); -- 获取内层游标下一行数据 FETCH NEXT FROM InnerCursor INTO @InnerValue1, @InnerValue2; END; -- 关闭内层游标 CLOSE InnerCursor; -- 释放内层游标 DEALLOCATE InnerCursor; -- 获取外层游标下一行数据 FETCH NEXT FROM OuterCursor INTO @OuterValue1, @OuterValue2; END; -- 关闭外层游标 CLOSE OuterCursor; -- 释放外层游标 DEALLOCATE OuterCursor; ``` ### 代码解释 1. **外层游标**:声明并打开外层游标,遍历`OuterTable`的每一行数据。 2. **内层游标**:在外层游标的每次循环中,声明并打开内层游标,根据外层游标当前行的数据筛选`InnerTable`的相关行进行遍历。 3. **数据处理**:在内层游标循环中,可以对当前行的数据进行处理,这里只是简单地打印出来。 4. **游标关闭和释放**:内层游标和外层游标在使用完后都需要关闭并释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值