关于在存储过程中使用游标操作数据库

本文介绍了一种使用游标操作数据库的方法,通过存储过程批量处理数据,包括插入问题及其回复记录。具体实现涉及SQL Server的多种功能,如字符串处理、随机数生成等。

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

 
----------------------使用游标操作数据库------------------------------------------

alter procedure doTable
as
DECLARE @A1 VARCHAR(200),@A2 VARCHAR(200),@A3 varchar(1000),@A4 varchar(200)
declare @i int
declare @j int
declare @length int
declare @questionId varchar(50)
declare @areaid varchar(50)
declare @creatuser varchar(50)
declare @content varchar(100)
declare @replyAccount varchar(50)
declare @replyMembeId varchar(50)
declare @postTime datetime
DECLARE test CURSOR  FOR SELECT 标题,id,内容,分类 FROM view1
OPEN test
fetch next from test into @a1,@a2,@a3 ,@a4

while @@fetch_status<>-1
begin
---设定第几条数据
set @j=0

--------去除左右空格
 
 set @a3=rtrim(ltrim(@a3))
 set @i=charindex('|||',@a3)
 while @i>=1
 begin

  ---第一条数据的话
  if @j=0
  begin
 
  set @questionId=newid()
  -------添加到问题列表中
  set @content=left(@a3,@i-1)

  set @j=@j+1

  ---获得任意一个用户
  select top 1 @creatuser=account from member order by newid()
  
  ---获得任意一个地区
  select top  1 @areaid=id from memberarea order   by   newid()  

  insert into question (ID,F_CATALOGID,F_AREAID,TITLE,CONTENT,POSTUSER,createuser)
  
      values (@questionId,@a2,@areaid,@a1,@content,@creatuser,@creatuser)

  
  end
  ---如果不是第一条记录,那就是问题的回复
  else
  begin

  -------添加回复问题的表中  
  ---获得任意一个用户
  select top 1 @replyAccount= account,@replyMembeId=id from member order by newid()
 
  --一年内的随机时间
  set @postTime=dateadd(day, -cast(ceiling(rand() *365) as int),convert(char(50),getdate(),20))


  insert into QUESTIONREPLY (F_QUESTIONID,TITLE,CONTENT,REPLYUSER,CREATEDATE,replydate,createuser,posta,postb)
      values (@questionId,@a1,left(@a3,@i-1),@replyAccount,@postTime,@postTime,@replyMembeId,cast(ceiling(rand() *2) as int)-1,cast(ceiling(rand() *2) as int)-1)
  end


 set @a3=substring(@a3,@i+3,len(@a3)-@i)
 set @i=charindex('|||',@a3)
   

 end

 if @a3<>'/'
 begin
  if @j=0
  begin
  -------只有一条,添加到问题列表中
    ---获得任意一个用户
  select top 1 @creatuser=account from member order by newid()
  
  ---获得任意一个地区
  select top  1 @areaid=id from memberarea order   by   newid() 


  set @questionId=newid()
   insert into question (id,F_CATALOGID,F_AREAID,TITLE,CONTENT,POSTUSER,createuser)
    
     values (@questionId,@a2,@areaid,@a1,@a3,@creatuser,@creatuser)
  end
  else
  begin

  -------添加回复问题的表中
  ---获得任意一个用户
  select top 1 @replyAccount= account,@replyMembeId=id from member order by newid()
 
  --一年内的随机时间
  set @postTime=dateadd(day, -cast(ceiling(rand() *365) as int),convert(char(50),getdate(),20))


  insert into QUESTIONREPLY (F_QUESTIONID,TITLE,CONTENT,REPLYUSER,CREATEDATE,replydate,createuser,posta,postb)
      values (@questionId,@a1,@a3,@replyAccount,@postTime,@postTime,@replyMembeId,cast(ceiling(rand() *2) as int)-1,cast(ceiling(rand() *2) as int)-1)
  
  end
  
 end


fetch next from test into @a1,@a2,@a3 ,@a4
end
close test
deallocate test


execute doTable

select 内容 from view1

select count(*) from question

select count(*) from questionreply


delete from question

delete from questionreply

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值