循环判断输入数据与表中数据是否一致!

lclonger 2010-10-11 01:21:19
我想判断输入的数据 @grade和@date 是否在表中存在,不存在新增,存在就跳出循环可我写的实现不了,哪位帮帮我呀,就是下面游标那的判断!
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
DECLARE @SQL NVARCHAR(1000)
declare @ID int
declare @TGRADE NVARCHAR(50)
DECLARE @TDATE DATE
--声明一条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

CREATE TABLE #TEMP_ALLLIST (ID INT identity,GRADE NVARCHAR(50),TESTDATE DATE)
SET @SQL=N'INSERT INTO #TEMP_ALLLIST(GRADE,TESTDATE)
SELECT GRADE,TESTDATE FROM '+@UPTABLE+''
EXEC SP_EXECUTESQL @SQL

DECLARE ID_CURSOR CURSOR SCROLL
FOR
(SELECT * FROM #TEMP_ALLLIST)
Open ID_CURSOR
--游标赋给变量
FETCH NEXT FROM ID_CURSOR INTO @ID,@TGRADE,@TDATE
--如果游标存在
WHILE(@@FETCH_STATUS=0)
BEGIN

IF(SELECT GRADE FROM #TEMP_ALLLIST WHERE ID=@ID) = @grade AND (SELECT TESTDATE FROM #TEMP_ALLLIST WHERE ID=@ID) = @date
BREAK

ELSE IF(SELECT GRADE FROM #TEMP_ALLLIST WHERE ID=@ID) <> @grade OR (SELECT TESTDATE FROM #TEMP_ALLLIST WHERE ID=@ID) <> @date
BEGIN

declare @INSERTSCORE Nvarchar(1000)
set @INSERTSCORE=N' INSERT INTO '+@UPTABLE+' (Grade, TestDate, Signs, '+@uptotal+')
values('+@grade+',CONVERT(date,@date),'+@SIGN+',@totalAvg)'
EXEC SP_EXECUTESQL @INSERTSCORE,N'@date varchar(50),@totalAvg float',@date,@totalAvg
END

FETCH NEXT FROM ID_CURSOR INTO @ID,@TGRADE,@TDATE --跳到下个游标
END

CLOSE ID_CURSOR
DEALLOCATE ID_CURSOR --释放游标
DROP TABLE #TEMP_ALLLIST

...全文
113 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lclonger 2010-10-11
  • 打赏
  • 举报
回复
不懂啊![Quote=引用 2 楼 wxf163 的回复:]
这个用2008的表类型来做比较好做
你这只不过是数据批量插入的一个转换形式。
[/Quote]
lclonger 2010-10-11
  • 打赏
  • 举报
回复
去掉也不好用呀,我是没办法了才加的,循环判断是按顺序来的,总会运行到不同的那条数据,然后有几条数据不同就插入几条调数据,c#可以双层循环判断,这个怎么弄呀?[Quote=引用 1 楼 jwdream2008 的回复:]
去掉:

SQL code
IF(SELECT GRADE FROM #TEMP_ALLLIST WHERE ID=@ID) = @grade AND (SELECT TESTDATE FROM #TEMP_ALLLIST WHERE ID=@ID) = @date
BREAK
[/Quote]
王向飞 2010-10-11
  • 打赏
  • 举报
回复
这个用2008的表类型来做比较好做
你这只不过是数据批量插入的一个转换形式。
jwdream2008 2010-10-11
  • 打赏
  • 举报
回复
去掉:
       IF(SELECT GRADE FROM #TEMP_ALLLIST WHERE ID=@ID) = @grade AND (SELECT TESTDATE FROM #TEMP_ALLLIST WHERE ID=@ID) = @date
BREAK

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧