首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

执行存储过程老提示必须声明标量变量!来大森帮小弟我看看

2013-12-20 
执行存储过程老提示必须声明标量变量!来大森帮我看看set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER P

执行存储过程老提示必须声明标量变量!来大森帮我看看
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[TPGL_vote]
(
    
  @camid varchar(20),/*活动概要ID*/
 
  @detailsid varchar(20),/*活动明细ID*/
  @uid   varchar(20),/*用户ID*/
  @cou int output /*0 error 投票结束 1投票成功  2 该用户已经投票该活动 3 投票总数超过可投票数 4*/
)
as 
/*定义SQL语句变量*/
   Declare  @sql nvarchar(4000)
  
   Declare  @sumvotes int

   Declare  @countvotes int

   Declare  @votes int
   Declare  @uvotes int

      
  begin
 /*事物开始*/
     
        
            begin
                 /*查询投票活动状态*/
  /*set @sql='select @count=count(*) from emp where id=@id'   
  exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out ,@id
*/
                 set @sql='select @ret= CAM_STATUS  from TPGL_CAMPAIGN where CAM_ID=@camid'
                    
               
                  exec sp_executesql @sql, N'@ret int out,@camid varchar(20)', @cou out ,@camid
                  /*0为结束 1 正在进行*/
                  if(@cou = 0)
                     begin
                     set @cou=0;
                     return @cou;
                  end
                  else
                      begin
                     /*判断是否已经投票*/
                     set @sql='select  @count=count(*) from TPGL_CAM_USER_MIDDLE where CAM_ID=@detailsid and UID=@uid'
                     exec sp_executesql @sql, N'@count int out,@detailsid varchar(20),@uid varchar(20)', @cou out ,@detailsid,@uid
                     if(@cou =1)
                          begin
                      /*该用户已投过票*/
                           set @cou=2;
                           return @cou
                          end
                     else
                     begin
                     /*判断是否超过可投票数 查询票数和*/
                       set @sql=' select  @liz=SUM(CAM_VOTES)from TPGL_CAM_DETAILS where CAM_ID=@camid'
                       exec sp_executesql @sql, N'@liz int out,@camid varchar(20)', @sumvotes out ,@camid
                    /*查询可投票数*/


                       set @sql=' select  @lizhi=CAM_COUNT from TPGL_CAMPAIGN where CAM_ID=@camid'
                       exec sp_executesql @sql, N'@lizhi int out,@camid varchar(20)', @countvotes out ,@camid
                        print @sumvotes  
                        print @countvotes 
                        if (@sumvotes > @countvotes)
                              begin
                       
                       
                              set @cou=3;

                              return @cou
                              end 
                      else 
                      begin
                     /*投票成功*/
                    /*查询已有票数*/
                      set @sql=' select  @lizhii=CAM_VOTES from TPGL_CAM_DETAILS where  DETAILS_ID=@detailsid'
                      exec sp_executesql @sql, N'@lizhii int out,@detailsid varchar(20)', @votes out ,@detailsid
                     
 
 //应该是这句错了                     set @uvotes=@votes+1;
 

                   /*对已有票数+1投票成功*/
                      set @sql=' update   TPGL_CAM_DETAILS set CAM_VOTES =@uvotes where DETAILS_ID=@detailsid'
                      
                      exec sp_executesql @sql 
                      set @sql='insert into TPGL_CAM_USER_MIDDLE(UID,DETAILS_ID,CAM_ID) values('+@uid+','+@detailsid+','+@camid+')'
                      exec sp_executesql @sql 
                      set @cou=1;
                     
                      return @cou
                      end
                     
                    end
                  end
              

    

            end

      
  end

消息 137,级别 15,状态 2,第 1 行
必须声明标量变量 "@uvotes"。




















[解决办法]
@uvotes没申明,declare一下,或者在参数里面传一下。
[解决办法]
听说sp_executesql运行之后变量就无效,不知道是不是这个原因
[解决办法]
 把上面的声明变量的地方写在这个上面!

//应该是这句错了                     set @uvotes=@votes+1;
[解决办法]
太多了,不想看,如果是楼上说的set @uvotes=@votes+1;这句出错,那么你看看在这句之前你有没有对@votes赋初始值了。没赋值就是错的。

热点排行