T-SQL中最有效的方法是将答案字符串与答案密钥进行比较,以便对考试进行评分

时间:2010-10-15 17:57:10

标签: sql algorithm tsql comparison

这些考试通常有大约120个问题。目前,它们将字符串与键进行比较,并指定值1或0。完成后,总得分为1。

是否有任何T-SQL函数,例如intersect或diff或者所有不同的函数,可以尽快为100,000名考生处理这个过程?

提前感谢您的专业知识。

-Steven

2 个答案:

答案 0 :(得分:0)

尝试将问题的相等性选为正确的答案。我假设你把学生的考试放在一张桌子里,关键放在另一张桌子里;这样的事情应该有效:

select student_test.student_id, 
   student_test.test_id, 
   student_test.question_id, 
   (student_test.answer == test_key.answer OR (student_test.answer IS NULL AND test_key.answer IS NULL))
from student_test
INNER JOIN test_key
   ON student_test.test_id = test_key.test_id
      AND student_test.question_id = test_key.question_id
WHERE student_test.test_id = <the test to grade>

您可以按学生分组结果并进行测试,如果您希望数据库为您提供总分,则可以将最后一列合计。这将对测试进行详细的“正确/错误”分析。

编辑:将答案存储为连续字符串使其变得更加困难。您很可能必须使用游标以过程方式实现此功能,这意味着每个学生的答案都会被加载,SUBSTRING到varchar(1)中,并与RBAR中的键(通过痛苦行划分)方式进行比较。您还可以实现一个标量值函数,它将字符串A与字符串B一次比较一个字符并返回差异数,然后从驱动查询中调用该函数,该查询将为每个学生调用此函数。

答案 1 :(得分:0)

这样的事可能对你有用:

select student_id, studentname, answers, 0 as score
    into #scores from test_answers
declare @studentid int
declare @i int
declare @answers varchar(120)
declare @testkey varchar(120)
select @testkey = test_key from test_keys where test_id = 1234
declare student_cursor cursor for
    select student_id from #scores
open student_cursor
fetch next from student_cursor into @studentid
while @@FETCH_STATUS = 0
begin
    select @i = 1
    select @answers = answers from #scores where student_id = @studentid
    while @i < len(@answers)
    begin
        if mid(@answers, @i, 1) = mid(@testkey, @i, 1)
            update #scores set score = score + 1 where student_id = @studentid
        select @i = @i + 1
    end
    fetch next from student_cursor into @studentid
end
select * from #scores
drop table #scores

我怀疑这是最有效的方法,但它至少不是一个糟糕的起点。