SQL Server游标的使用

1、 SQL Server中游标的使用

1.1  游标和游标的优点

在数据库中,游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条T_SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。

1.2 游标的种类

Microsoft SQL Server支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。

1.2 游标的操作

使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。


2、 游标的使用

实例要求:使用游标获取前20位用户信息和购买记录。

DECLARE @UserId INT, @PetName VARCHAR(50), @BuyCound INT
DECLARE User_Cursor CURSOR	--声明游标
FOR
	SELECT TOP 20 UserId , PetName FROM UserInfo 
OPEN User_Cursor	--打开游标
FETCH NEXT FROM User_Cursor INTO @UserID,@PetName	--提取数据(将游标向下移1行,获取的数据保存到定义的变量@UserID,@PetName中)
WHILE (@@FETCH_STATUS = 0)	--判断是否成功获取数据
BEGIN
	SELECT @BuyCound = COUNT(*) FROM UserPrdBuy WHERE UserID = @UserID
	PRINT '用户编号:' + CONVERT(VARCHAR(10),@UserId) + ' 用户名称:' + @PetName + ' 购买数量:' + CONVERT(VARCHAR(10),@BuyCound)
	FETCH NEXT FROM User_Cursor INTO @UserID,@PetName	--将游标向下移1行,获取的数据保存到定义的变量@UserID,@PetName中
END
CLOSE User_Cursor	--关闭游标
DEALLOCATE User_Cursor	--删除游标


3、游标的案例

案例要求:同步库存系统的用户表到服务平台的用户表中

-----游标循环同步---------------------------------------------------------------
DECLARE @UserName NVARCHAR(50)
DECLARE @CompanyID INT
DECLARE @result int
DECLARE tnames_cursor CURSOR
FOR
	SELECT  TOP 10 UserID FROM UserAccount 
	WHERE UserName NOT IN
	(SELECT UserName FROM [172.168.16.22].MyDB.dbo.USerInfo)
	AND UserType=1
OPEN tnames_cursor
DECLARE @UserID sysname
FETCH NEXT FROM tnames_cursor INTO @UserID
WHILE (@@FETCH_STATUS = 0)
BEGIN
	SELECT @CompanyID = CompanyID FROM UserAccount WHERE UserID = @UserID
     exec proc_SynchronizeToHqew @result output,@UserID,@CompanyID
     print @result
     FETCH NEXT FROM tnames_cursor INTO @UserID
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
----------------------------------------------------------------------------------

----存储过程-------------------------------------------------------------------------------
if exists (select * from sysobjects where name='proc_SynchronizeToHqew')
drop procedure proc_SynchronizeToHqew
go
Create Procedure proc_SynchronizeToHqew
@result int output,
@sm_UserID int,
@sm_CompanyID int
as
--Begin Transaction
Declare @errorSum int
Declare @UserName NVARCHAR(100)
Declare @Password NVARCHAR(100)
Declare @RegisterTime datetime
Declare @companyName NVARCHAR(100)
Declare @Address NVARCHAR(100)
Declare @parentID int
Declare @HqewUserName NVARCHAR(100)
Declare @Info_UserID int 
Declare @RealName NVARCHAR(50)
Declare @Phone NVARCHAR(50)

set @errorSum =0
set @result =1
set @parentID =0
set @Info_UserID=0

--获取parentID
select @HqewUserName=HqewUserName,@companyName=CompanyName,@Address=Address from CompanyCustomer where CompanyID = @sm_CompanyID
select @parentID = UserID from [172.168.16.22].MyDB.dbo.USerInfo where UserName = @HqewUserName
if(@parentID<>0)
begin
	--获取用户信息并同步UserInfo表
	select  @UserName=UserName,@Password=UserPwd,@RegisterTime=CreateTime,@RealName=RealName,@Phone=phone from UserAccount where UserID = @sm_UserID 
	insert into [172.168.16.22].MyDB.dbo.USerInfo(UserName,Password,ParentUserID,UserGUID,FailureCount,LoginCount,LoginCount,NoLawWordsCount,UserScore,UserStatus,UserType,groupid,RegisterTime) 
	values(@UserName,@Password,@parentID,newid(),0,0,0,0,0,1,2,11,@RegisterTime)
	set @errorSum =@errorSum+@@error
	
	--获取用户信息并同步UserInfoAssis表
	select @Info_UserID = UserID from [172.168.16.22].MyDB.dbo.USerInfo where UserName = @UserName and parentUserID = @parentID
	set @errorSum =@errorSum+@@error
	if(@Info_UserID<>0)
	begin
		--获取用户信息并同步USerInfoAssis表
		insert into [172.168.16.22].MyDB.dbo.USerInfoAssis(UserID,CompanyName,Address,LinkMan,Nickname,Phone,FinancePassword,FinanceAmount,FinanceEnabledAmount,FinanceErrorTimes,FinanceFrozenAmount,ICAmount,IsValidateMail,PostedPromotionInfoAmount,PromotionInfoAmount,ISCPStatus,ISCPType,CommisionAccountToal,CommisionAccountFrozen,CommisionAccountAvailable,HonestyNum,HonestyLevel,HonestyStatus,IsEscrow,PersonGender,BuyType)
		values (@Info_UserID,@companyName,@Address,@RealName,@RealName,@Phone,@Password,0,0,0,0,0,0,0,0,4,0,0,0,0,-1,-1,0,1,1,4)		
		set @errorSum =@errorSum+@@error
	end
	Else
	begin
		set @result =0
	end 	
end

else
begin
	set @result =0
	print '失败同步! 子账号ID' + convert(varchar(10),@sm_UserID) + '找不到ParentID'
end

if(@errorSum =0 and @result=1 )
begin
	 print '成功同步!  子账号ID' + convert(varchar(10),@sm_UserID)
--	Commit Transaction
end
else
begin 
	print '失败同步! 子账号ID' + convert(varchar(10),@sm_UserID) + '数据回滚'
--	Rollback Transaction
end

go


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pan_junbiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值