Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在T-SQL中,比较答案字符串和答案键的最有效方法是什么_Sql_Algorithm_Tsql_Comparison - Fatal编程技术网

在T-SQL中,比较答案字符串和答案键的最有效方法是什么

在T-SQL中,比较答案字符串和答案键的最有效方法是什么,sql,algorithm,tsql,comparison,Sql,Algorithm,Tsql,Comparison,这些考试通常有大约120个问题。目前,这些字符串与键进行比较,并指定值1或0。完成后,将原始分数加总1 是否有任何T-SQL函数,如intersect或diff或其他不同的函数,可以为100000名考生尽快处理此过程 提前感谢您的专业知识 -史蒂文试着选择一个与正确答案相等的问题。我假设你在一个表中有学生的测试,在另一个表中有键;这样的事情应该行得通: select student_test.student_id, student_test.test_id, student_te

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

是否有任何T-SQL函数,如intersect或diff或其他不同的函数,可以为100000名考生尽快处理此过程

提前感谢您的专业知识


-史蒂文

试着选择一个与正确答案相等的问题。我假设你在一个表中有学生的测试,在另一个表中有键;这样的事情应该行得通:

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>
您可以按学生和测试对结果进行分组,如果希望DB给出总分,则将最后一列相加。这将给出测试的详细对/错分析


编辑:答案被存储为一个连续的字符串,这使得编辑变得更加困难。您很可能需要以一种程序化的方式使用光标来实现这一点,这意味着每个学生的答案都会被加载、子串到varchar1s中,并通过折磨行的方式与RBAR行中的键进行比较。您还可以实现一个标量值函数,将字符串a和字符串B一次比较一个字符,并返回差异数,然后从驱动查询调用该函数,该查询将为每个学生调用此函数。

类似的操作可能适合您:

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

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

应答字符串和应答键都存储为字符串而不是表中的行。这将如何改变您在上面发布的逻辑。换句话说,我从考生id:1111111答案字符串开始:abcddcabbcdd答案键:abdcddabccdd你敢说你在SQLServer中的记录由一列组成,其中包含一个长字符串,由120个字符组成,代表120个问题的多项选择答案,然后是另一个由正确的多项选择答案组成的字符串?字符串中的答案比将答案作为单独的行存储在表格user_id、testnumber QUEST_number、ANSWERT…中要困难得多,那么与答案表格进行比较就相对简单了。因为它被保存在一列中,所以您必须循环它,或者使用子字符串来比较字符串120中的每个字母,这就有点不可行了。您是否有可能重新排列DB模式,以从字符串格式中获得这些答案?