我写了个存储过程如下,为什么调用的时候提示“在将 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
(
@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 2不是一张表啊
你看看你的数据,直接用select查试试报错不抱错?
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你再试试看 给你调整了一下 字符串的链接