我在做一个web的考试系统。用户出题操作后,由存储过程自动生成一套试卷,并显示在浏览器中。用户答题时,他的客案是在记录在客户端的,他交卷后,把题号及相应的答案作为参数提交到数据库,然后使用存储过程遍历这一参数,逐题UPDATE现在碰到的问题是:
由于得逐题update,有100道题就得update100次。虽然能实现预想的功能,但耗费的数据库资源大太了。有没有好的解决办法呢?

解决方案 »

  1.   

    逐题update 是干啥的
    当用户的 用户名和题号,答案存入表中之后,和标准答案表联接一下不就可以计算出得分了?
    你什么意思?不明白
      

  2.   

    谢1楼回复。
    这个过程就是要把用户的题号和答案存入表中的操作。和计算得分无关。从客户端传来的参数是1:A;2:B:,3:C,......100:A;存储过程要做个循环,取出每题的答案,然后更新到用户试卷的表中。
    就是这个循环要不停地执行更新操作,才导致运行效率很低的。
      

  3.   


    先把参数拆开,写到一个临时表中(Number,Selected),一次update就可以.
      

  4.   

    to 3楼:
    我在是循环体内每取出一个答案(@ls_answ),就update一次UPDATE 考生考卷 SET 考生答案 = @ls_answ WHERE 考卷ID = @l考卷ID AND 题号 = @题号
      

  5.   

    to chang99:
    我是新手,能给个简单的示例吗?十分感谢!
      

  6.   

    to chang99:
    拆参数我会,指导我一下怎么写入临时表,怎么更新。谢谢!!
      

  7.   

    --创建一个函数
    CREATE function [dbo].[StringSplit](@str nvarchar(max),@spliter nvarchar(10)) returns @tb table(ch nvarchar(256)) AS BEGIN DECLARE @Num int,@Pos int, @NextPos int SET @Num = 0 SET @Pos = 1 WHILE(@Pos <= LEN(@str)) BEGIN SELECT @NextPos = CHARINDEX(@spliter, @str, @Pos) IF (@NextPos = 0 OR @NextPos IS NULL) SELECT @NextPos = LEN(@str) + 1 INSERT INTO @tb VALUES(RTRIM(LTRIM(SUBSTRING(@str, @Pos, @NextPos - @Pos)))) SELECT @Pos = @NextPos+1 END return END --然后
    update t set ..........from youtable y,[dbo].[StringSplit](字符串,分隔符)s 
    where y.题号=s.题号
      

  8.   

    帮我的都有分,不管有用没有,所以Beirut没有给你满分,是因为其它二位XD也都分了些,谅解啊。