ALTER PROCEDURE [dbo].[usp_syn_kmbs] @batchid int --输入参数 --如果声明OUTPUT为输出参数 AS BEGIN declare @username varchar --声明变量 declare @cellphone varchar declare @storecode varchar declare @sid int declare cur cursor for --定义游标 SELECT [SID],USERNAME, CELLPHONE,STORECODE FROM KMBS_SOURCE WHERE BATHCID=@batchid open cur--打开游标 fetch next from cur into @sid,@username,@cellphone,@storecode --把提取操作的列数据放到局部变量中 while(@@fetch_status=0) --游标读取下一条数据是否成功 begin declare @isin int declare @autoid int select @isin=isnull([dkr_id],0) from [KMBS_REGISTER] where [DKR_CELLPHONE]=@cellphone if @isin=0 begin INSERT INTO [KMBS_REGISTER] ([DKR_SID] ,[DKR_NAME] ,[DKR_NICKNAME] ,[DKR_CELLPHONE] ,[DKR_STORECODE] ,[CREATEDATE] ,[UPDATEDATE] ,[DKR_ISNEW] ,[DKR_ISFINISH] ,[DKR_CALLER],BITCHID) values(@sid,@username,@username,@cellphone,@storecode,GETDATE(),GETDATE(),0,0,0,@batchid) select @autoid= @@identity select @isin=isnull(dre_id,0) from REGISTER where DRE_CELLPHONE=@cellphone if @isin>0 begin update [KMBS_REGISTER] set DKR_DRE_ID=@isin where DKR_ID=@autoid end end else begin update KMBS_SOURCE set ISIN=@isin where [SID]=@sid end fetch next from cur into @sid,@username,@cellphone,@storecode --读取下一条数据记录放到局部变量中,变量的数目必须与游标选择列表中的列的数目一致 end close cur--关闭游标 deallocate cur--删除游标 update KMBS_BATCH set REPEATNUMBER=(select COUNT(*) from KMBS_SOURCE where BATCHID=@batchid and ISIN is not null) ,SUCCESSNUMBER=(select COUNT(*) from KMBS_REGISTER where BATCHID=@batchid) ,UPDATEDATE=GETDATE() ,TOTAL=(select COUNT(*) from KMBS_SOURCE where BATCHID=@batchid) ,[STATE]=2 where BATCHID=@batchid END
整体看上去没有错误,但细心的童鞋会发现问题: 1、varchar未定义长度 2、if @isin=0 会不被执行,因为查出来的结果集有可能为null 故在下面做一下处理set @isin = isnull(@isin,0) 补救. 3、 由于 select @isin=isnull([dkr_id],0) 不会被执行,所以导致变量一直不会更新 所以在查询之前先设置一下:set @isin=null 最后进行一下优化处理:在头部声明时加上SET NOCOUNT ON;