2010-10-15 59 views
0

這些考試通常有大約120個問題。目前,它們的字符串與鍵和1或0的值進行比較。完成後,將原始分數加1。什麼是最有效的方式在T-SQL比較答案字符串和回答考試得分的鍵

是否有任何T-SQL函數像交叉或差異或者其他所有東西一樣不同,以便儘可能快地爲100,000個被測試者處理此過程?

在此先感謝您的專業知識。

-Steven

+0

的回答讓這個困難得多比原先他們被存儲在一個單獨的錶行(USER_ID,testnumber QUESTION_NUMBER,接聽)...然後它會是相對簡單的比較的回答表。由於它是在一個列中進行的,因此您必須循環它,或者使用子字符串來比較字符串中的每個字母(120個答案有點不可行)。任何你可以重新排列你的數據庫模式來獲得這些答案的字符串格式? – Twelfth 2010-10-15 19:23:08

回答

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> 

可以組結果由學生和試驗,再總結最後一欄,如果你想在DB給你的總得分。這將對測試進行詳細的「正確/錯誤」分析。

編輯:被存儲爲連續字符串的答案使它更難。你很可能不得不用程序的方式來實現這個功能,這意味着每個學生的答案都會被加載,SUBSTRING到varchar(1)中,並與RBAR中的按鍵(通過排成行的行)進行比較。您也可以實現一個標量值函數,它將字符串A與字符串B逐個比較並返回差異數,然後從驅動查詢中調用該函數,該查詢將爲每個學生調用此函數。

+0

答案字符串和答案鍵都以字符串形式存儲在表中。這是如何改變你上面發佈的邏輯的。換句話說,我開始與examinee_id:1111111答案字符串:ABCDDCABBCCDDD答案:ABDCDDDABCCCD – sfmatthews 2010-10-15 18:24:46

+0

你是說你在SQLServer中的記錄包含一個單列包含一個長字符串,其中包含一個120個字符的字符串表示多選答案到120個問題,然後是由正確的多選答案組成的另一個字符串? – Tim 2010-10-18 00:18:02

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 

我懷疑這是做到這一點的最有效的方式,但它至少是個不錯的起點。在一個字符串舉行