这些考试通常有大约120个问题。目前,它们将字符串与键进行比较,并指定值1或0。完成后,总得分为1。
是否有任何T-SQL函数,例如intersect或diff或者所有不同的函数,可以尽快为100,000名考生处理这个过程?
提前感谢您的专业知识。
-Steven
答案 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
我怀疑这是最有效的方法,但它至少不是一个糟糕的起点。