PDA

View Full Version : آزمون آنلاین



arusha
پنج شنبه 04 شهریور 1395, 10:07 صبح
دوستان عزیز، سلام
فرض کنید میخوام یک برگه امتحانی یا یک آزمون از بین سوالات موجود در دیتابیس طراحی کنم.
من سه تا جدول دارم به نامهای question, course, section مربوط به سوال، درس و بخش هر درس (هر درس شامل چند بخش هست). داخل جدول سوال، id درس و بخش درس مشخص هست. و داخل جدول بخش، id درس مشخص هست. در جدول بخشها، یک فیلد دیگر هم به نام barom وجود دارد که بارم هر بخش را مشخص می کند به این معنی که اگر بارم یک بخش 3 باشد یعنی باید 3سوال از این بخش این درس انتخاب شود.
حالا من در یک storedprocedure میخوام که id درس رو به صورت پارامتر دریافت کنم. بعد ، لیست سوالات این درس با توجه به بارم هر بخش به صورت تصادفی انتخاب شود. برای مثال:

select top(3) id from question where course_fk = @c and section_fk =5 order by newid()

مشکل اینجاست که نمی دونم چطوری این کار رو انجام بدم که وقتی id درس رو می گیره به صورت خودکار به ازای هر بخش از درس تعداد سوالی که بارم مشخص می کنه انتخاب بشه.

لطفا اگه میتونید راهنماییم کنید. دعاتون می کنم :لبخندساده:

En_MK
یک شنبه 14 شهریور 1395, 10:26 صبح
میتونید یه جدول temp بسازید و تمام نتایجی که از select بدست میاد رو در اون insert کنید و اخر کار تمام سوالات در جدول temp وجود دارد




DECLARE @Query nvarchar(MAX),

@ErrorMsg nvarchar(max)

DECLARE Info CURSOR FOR
Select Question_Id,Barom from TbSection where Course_Id=@Id


OPEN Info
FETCH NEXT FROM Info INTO @Question_Id, @Barom

WHILE @@FETCH_STATUS = 0
BEGIN


BEGIN TRY


Exec ('SELECT top '+ @Barom+ ' * FROM tbQuestion WHERE Id >= RAND() *
( SELECT MAX (Id ) FROM tbQuestion )
ORDER BY Id')


END TRY
BEGIN CATCH
SET @ERRORMSG = 'ERROR NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR(5)) + CHAR(13)
+ 'PROCEDURE NAME : ' + ISNULL(ERROR_PROCEDURE(),'') + CHAR(13)
+ 'PROCEDURE LINE : ' + CAST(ERROR_LINE() AS VARCHAR(5)) + CHAR(13)
+ 'ERROR MESSAGE : ' + ERROR_MESSAGE() + CHAR(13);
PRINT @IPADDRESS + ' ERROR!'
PRINT @ERRORMSG
END CATCH

FETCH NEXT FROM Info INTO @Question_Id, @Barom
END