庖丁解牛-小程序版好友对战答题项目实践(一) (2)

从上面的表中可以看出,题目的答案选项我是用nvarchar存储的,这样方便管理人员进行编辑。默认第一个为正确答案。所以,在从题库中抽取题目时,需要将答案顺序打乱,并记录正确答案的序号。

        具体实现思路是,首先随机从题库中抽取有效的题目存入临时表,然后遍历每条记录,把选项打乱顺序,并存入新表。最后删除临时表,将已选的题目的状态更新为不可用。代码如下:

 

CREATE PROC [dbo].[proc_getsubject](@count INT,@homeId INT) AS BEGIN IF OBJECT_ID('tempdb..#Subject_TEMP','U') IS NOT NULL DROP TABLE #Subject_TEMP --随机从表中获取指定条数的有效题目,并存入临时表 SELECT TOP (@count) Title,Options,Id,Level INTO #Subject_TEMP FROM dbo.Subject WHERE Status=1 ORDER BY NEWID() --删除试卷中,当前房间号已存在的题目 DELETE [dbo].[ActivityItems] WHERE [HomeId]=@homeId --遍历每个题目 WHILE @count>0 BEGIN DECLARE @title NVARCHAR(500),@options NVARCHAR(2000), @level INT,--难易程度 @newoptions NVARCHAR(2000),@id INT,@optionCount INT ,--当前答案的数量 @answer INT--答案的索引,从1开始。 SET @newoptions='' --初始化 --从临时表中,取出一条数据 SELECT TOP 1 @title=Title,@options=Options,@id=Id,@level=Level FROM #Subject_TEMP IF OBJECT_ID('tempdb..#Options_TEMP','U') IS NOT NULL DROP TABLE #Options_TEMP --使用表值函数,分割答案选项,并打乱顺序。 SELECT * INTO #Options_TEMP FROM dbo.F_SplitSTR(@options,',') --获取选项的数量 SELECT @optionCount=COUNT(1) FROM #Options_TEMP DECLARE @temp_i INT--循环里的索引 SET @temp_i =1 --循环分割后的答案,拼接成新的答案选项字符串 WHILE @optionCount>0 BEGIN DECLARE @item NVARCHAR(200),@sort INT --随机从答案选项中选择 SELECT TOP 1 @item=col,@sort=sort FROM #Options_TEMP ORDER BY NEWID() SET @newoptions+=@item+',' IF @sort=1 SET @answer=@temp_i SET @optionCount-=1 SET @temp_i+=1 DELETE #Options_TEMP WHERE sort=@sort END SET @count-=1 --从临时表中删除刚刚处理过的题目 DELETE #Subject_TEMP WHERE Id=@id --将处理后的题目信息存入试卷表 PRINT(@newoptions) INSERT [dbo].[ActivityItems] VALUES(@title,@newoptions,@answer,@level,@HomeId,@id) END /*更新已选题库为无效状态,保证每道题只出现1次,测试时,可不执行此代码。这样题目是可以重复利用的*/ --UPDATE dbo.Subject SET Status=0 WHERE Id IN (SELECT SubjectId FROM [ActivityItems] WHERE HomeId=@homeId) SELECT * FROM ActivityItems WHERE HomeId=@homeId ORDER BY [Level] END

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfxyp.html