日期:2014-05-18  浏览次数:20567 次

从数据类型 nvarchar 转换为 float 时出错
SQL code
create procedure proc_HistoryGradeStandard
/*参数*/
(
    @total varchar(10)    ,            --要处理的列
    @searchTable varchar(50),        --要查询的表
    @uptotal varchar(10),            --要更新的列
    @UPTABLE varchar(50),            --要更新的表
    @grade varchar(50),                --年级
    @date varchar(50),                --考试日期
    @MONTH varchar(50)                --考试月份
)
as

    DECLARE @totalAvg float

    --声明一条sql语句
    declare @sqlTotal nvarchar(1000)    
        
    set @sqlTotal='select @totalAvg=SUM('+@total+')/NULLIF(COUNT(1),0) 
                    from '+@searchTable+'
                    where testdate=@date and grade=@grade'
    EXEC SP_EXECUTESQL @sqlTotal,N'@totalAvg float OUTPUT,@date datetime,@grade varchar(50)',@totalAvg OUTPUT,@date,@grade
    

    DECLARE @SIGN    nvarchar(10)
    
    /*根据考试月份判断是期中还是期末成绩*/
    IF( @MONTH='10')
        BEGIN
            set @SIGN=1
        END
    IF( @MONTH='11')
        BEGIN
            set @SIGN=1
        END
    IF(@MONTH= '12')
        BEGIN
            set @SIGN=2
        END
    IF(@MONTH= '1')
        BEGIN
            set @SIGN=2
        END
    IF( @MONTH='4')
        BEGIN
            set @SIGN=3
        END
    IF( @MONTH='5')
        BEGIN
            set @SIGN=3
        END
    IF( @MONTH='6')
        BEGIN
            set @SIGN=4
        END
    IF( @MONTH='7')
        BEGIN
            set @SIGN=4
        END
        
    declare @INSERTSCORE varchar(1000)
    [color=#FF0000]set @INSERTSCORE=N' INSERT INTO '+@UPTABLE+' (Grade, TestDate, Signs, '+@uptotal+',)
            values('+@grade+','+@date+','+@SIGN+','+Convert(float, @totalAvg)+')'[/color]    EXEC SP_EXECUTESQL @INSERTSCORE

运行到红字时就报“从数据类型 nvarchar 转换为 float 时出错”为什么呀?好像是@totalAvg不对。

------解决方案--------------------
SQL code
    declare @INSERTSCORE varchar(1000)
    set @INSERTSCORE=N' INSERT INTO '+@UPTABLE+' (Grade, TestDate, Signs, '+@uptotal+',)
            values('+@grade+','+@date+','+@SIGN+',@totalAvg)'
      EXEC SP_EXECUTESQL @INSERTSCORE, N'@totalAvg float', @totalAvg

------解决方案--------------------
INSERT INTO '+@UPTABLE+' (Grade, TestDate, Signs, '+@uptotal+',)

======================
多个逗号吧
------解决方案--------------------
如楼上
------解决方案--------------------
测试环境下,7楼的是通过的呀
------解决方案--------------------
原始数据没问题吧?
------解决方案--------------------
if 太多,能合并的合并
------解决方案--------------------
declare @INSERTSCORE varchar(1000)
改成
Nvarchar(1000)