简单创建存储过程范例

 
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;


你可能感兴趣的:(存储过程)