我写了个存储过程如下,为什么调用的时候提示“在将 varchar 值 '8年级' 转换成数据类型 int 时失败。”  出错的地方在下面注释着ALTER PROCEDURE USP_OKSCORE
(
@TABLE1 VARCHAR(50),--表1(要计算的表)
@TABLE2 VARCHAR(50),--表2(要更新的表)
@T1_C1_NAME VARCHAR(50),--表1的第一个参数列的名称(要计算维度)
@T1_C2_NAME VARCHAR(50),--表1的第二个参数列的名称(要计算班级列)
@T1_C3_NAME VARCHAR(50),--表1的第三个参数列的名称(要计算年级列)
@T2_C1_NAME VARCHAR(50),--表2的第一个参数列的名称(要更新的维度)
@T2_C2_NAME VARCHAR(50),--表2的第二个参数列的名称(要更新的班级列)
@T2_C3_NAME VARCHAR(50),--表2的第三个参数列的名称(要更新的年级列)
@T1_FULLSCORE FLOAT,--表1中的满分
@T2_CLASSNAME VARCHAR(50),--表2中指定的班级
@T2_GRADENAME VARCHAR(50)--表2中指定的年级

AS
BEGIN

DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAM NVARCHAR(1000)
----------------------------------------------------------
--计算表1中个人指定列的得分率
CREATE TABLE #TEMP_PERSON_SCORE (SEQ INT IDENTITY(1,1),ID VARCHAR(50),SCORE_PER FLOAT) SET @SQL='INSERT INTO #TEMP_PERSON_SCORE
  SELECT ID
,ISNULL('+ @T1_C1_NAME +'/NULLIF(@FULLSCORE,0),0)*100
  FROM ' + @TABLE1 +' WITH(NOLOCK)
  WHERE ' + @T1_C2_NAME + ' = @CLASSNAME
  AND ' + @T1_C3_NAME + ' = @GRADENAME '/*-----运行到这报错 @GRADENAME 传进来的值就是8年级------*/
  
SET @PARAM=N'@FULLSCORE FLOAT,@CLASSNAME VARCHAR(50),@GRADENAME VARCHAR(50)'
EXEC SP_EXECUTESQL @SQL,@PARAM,@T1_FULLSCORE,@T2_CLASSNAME,@T2_GRADENAME----------------------------------------------------------
--计算表2中指定的班级达标率
DECLARE @GOODCNT INT
DECLARE @SUMCNT INT
DECLARE @RESULT FLOAT SELECT @GOODCNT=COUNT(1) FROM #TEMP_PERSON_SCORE WITH(NOLOCK) WHERE SCORE_PER>=60 AND SCORE_PER<85
SELECT @SUMCNT=COUNT(1) FROM #TEMP_PERSON_SCORE WITH(NOLOCK)
SET @RESULT=ISNULL(ISNULL(@GOODCNT,0)*1.0/NULLIF(@SUMCNT,0),0)*100

SET @SQL='UPDATE ' + @TABLE2 +'
  SET ' + @T2_C1_NAME + ' = @RESULT ' + '
  WHERE ' + @T2_C2_NAME + ' =  @CLASSNAME
  AND ' + @T2_C3_NAME + ' = @GRADENAME '
  
SET @PARAM=N'@RESULT FLOAT,@CLASSNAME VARCHAR(50),@GRADENAME VARCHAR(50)'
EXEC SP_EXECUTESQL @SQL,@PARAM,@RESULT,@T2_CLASSNAME,@T2_GRADENAME DROP TABLE #TEMP_PERSON_SCORE

END
GO

解决方案 »

  1.   

    我没有把8年级转成  int呀?为什么它自己转呢?
      

  2.   

    我如果把出错的地方注释了 下面有类似的地方(@gradename) 就可以运行呀
      

  3.   

    数据的情况
    因为你1 2不是一张表啊
    你看看你的数据,直接用select查试试报错不抱错?
      

  4.   

    @GRADENAME  这个参数哪里来的 我想是你的连接字符没有写对 如果是字符串时要用''这个引起来的  
      

  5.   


    ALTER PROCEDURE USP_OKSCORE
    (
        @TABLE1    VARCHAR(50),--表1(要计算的表)
        @TABLE2 VARCHAR(50),--表2(要更新的表)
        @T1_C1_NAME VARCHAR(50),--表1的第一个参数列的名称(要计算维度)
        @T1_C2_NAME VARCHAR(50),--表1的第二个参数列的名称(要计算班级列)
        @T1_C3_NAME VARCHAR(50),--表1的第三个参数列的名称(要计算年级列)
        @T2_C1_NAME VARCHAR(50),--表2的第一个参数列的名称(要更新的维度)
        @T2_C2_NAME VARCHAR(50),--表2的第二个参数列的名称(要更新的班级列)
        @T2_C3_NAME VARCHAR(50),--表2的第三个参数列的名称(要更新的年级列)
        @T1_FULLSCORE FLOAT,--表1中的满分
        @T2_CLASSNAME VARCHAR(50),--表2中指定的班级
        @T2_GRADENAME VARCHAR(50)--表2中指定的年级

    AS
        BEGIN
        
            DECLARE @SQL NVARCHAR(4000)
            DECLARE @PARAM NVARCHAR(1000)
    ----------------------------------------------------------
            --计算表1中个人指定列的得分率
            CREATE TABLE #TEMP_PERSON_SCORE (SEQ INT IDENTITY(1,1),ID VARCHAR(50),SCORE_PER FLOAT)        SET @SQL='INSERT INTO #TEMP_PERSON_SCORE
                      SELECT ID ,ISNULL('+ @T1_C1_NAME +'/NULLIF(@FULLSCORE,0),0)*100 FROM ' + @TABLE1 +' WITH(NOLOCK)
                      WHERE ' + @T1_C2_NAME + ' ='''+ @CLASSNAME+''' AND ' + @T1_C3_NAME + ' ='''+ @GRADENAME+''                  
            SET @PARAM=N'@FULLSCORE FLOAT,@CLASSNAME VARCHAR(50),@GRADENAME VARCHAR(50)'
            EXEC SP_EXECUTESQL @SQL,@PARAM,@T1_FULLSCORE,@T2_CLASSNAME,@T2_GRADENAME----------------------------------------------------------
            --计算表2中指定的班级达标率
            DECLARE @GOODCNT INT
            DECLARE @SUMCNT INT
            DECLARE @RESULT FLOAT                SELECT @GOODCNT=COUNT(1) FROM #TEMP_PERSON_SCORE WITH(NOLOCK) WHERE SCORE_PER>=60 AND SCORE_PER<85
            SELECT @SUMCNT=COUNT(1) FROM #TEMP_PERSON_SCORE WITH(NOLOCK)
            SET @RESULT=ISNULL(ISNULL(@GOODCNT,0)*1.0/NULLIF(@SUMCNT,0),0)*100
            
            SET @SQL='UPDATE ' + @TABLE2 +'
                      SET ' + @T2_C1_NAME + ' = @RESULT ' + '
                      WHERE ' + @T2_C2_NAME + ' =  @CLASSNAME
                      AND ' + @T2_C3_NAME + ' = @GRADENAME '
                      
            SET @PARAM=N'@RESULT FLOAT,@CLASSNAME VARCHAR(50),@GRADENAME VARCHAR(50)'
            EXEC SP_EXECUTESQL @SQL,@PARAM,@RESULT,@T2_CLASSNAME,@T2_GRADENAME        DROP TABLE #TEMP_PERSON_SCORE
            
        END
    GO你再试试看 给你调整了一下 字符串的链接