游标那点事儿

本文介绍了SQL中两种循环跳出方法及实践案例:利用游标和动态SQL实现对某表所有字段的更新操作。重点突出循环逻辑及游标的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两种循环跳出方法

1:稍显复杂点:

CREATE  PROCEDURE dbo.usp_crAllTables

@Client_ID VARCHAR(256)
AS
DECLARE @table_name VARCHAR(50)
SET NOCOUNT ON 
DECLARE T_Name_Cur CURSOR LOCAL STATIC FORWARD_ONLY FOR 
SELECT name FROM 
(VALUES ('Jim'),('Tom'),('Anna')) AS a (name)
OPEN T_Name_Cur 
WHILE 1=1
BEGIN 
FETCH NEXT FROM T_Name_Cur INTO @table_name
IF @@FETCH_STATUS<>0 BREAK
PRINT @table_name
END 
CLOSE T_Name_Cur

DEALLOCATE T_Name_Cur


重点在于break放置位置,避免重复取最后一行,这两种方法的print那里就是我们想要循环执行东东的地方。


2.直接用@@fetch_status 作为循环终止条件

SET NOCOUNT ON
DECLARE T_Name_Cur CURSOR LOCAL STATIC FORWARD_ONLY FOR
SELECT name FROM
(VALUES ('Jim'),('Tom'),('Anna')) AS a (name)
OPEN T_Name_Cur
FETCH NEXT FROM T_Name_Cur INTO @table_name
WHILE (@@fetch_status=0)
BEGIN
PRINT @table_name
FETCH NEXT FROM T_Name_Cur INTO @table_name
END
CLOSE T_Name_Cur
DEALLOCATE T_Name_Cur
需要记得想要在循环内执行的东西要放到两个fetch next之间才好。


实践,游标加上动态SQL 实现对某表的所有字段进行更新的操作

CREATE PROCEDURE Clean_up_raw_tables 
@Table_Name VARCHAR(256) 
as 
DECLARE @NAME VARCHAR(256), 
@SQL VARCHAR(MAX) 
DECLARE RE_CUR CURSOR LOCAL STATIC FORWARD_ONLY FOR 
SELECT NAME FROM SYSCOLUMNS WHERE ID=OBJECT_ID(@Table_Name) AND NAME!='ID' 

OPEN RE_CUR 
WHILE (1=1) 
BEGIN 
FETCH NEXT FROM RE_CUR INTO @NAME 
IF @@FETCH_STATUS<>0 BREAK 
SET @SQL='UPDATE '+@Table_Name+' SET '+@NAME+'=REPLACE('+@NAME+',''"'','''')' 
PRINT @SQL 
EXEC(@SQL) 
END 
CLOSE RE_CUR 
DEALLOCATE RE_CUR


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值