SQL Server和Access分别可取得随机记录

来源:互联网 发布:英文简历 知乎 编辑:程序博客网 时间:2024/05/17 04:34

此段代码无论是速度、均衡性,还是随机度都非常好,也不会出现抽到重复记录的可能。

一、在SQL Server2000中生成随机记录的最好办法:

 

withtk_querydo            begin            Close;            sql.clear;            sql.Add('selecttop'+inttostr            (st_count)+'tk.ID,标准答案from题库表tk');            sql.Add('wherepidisnullandtk.题型=            '+quotedstr(tx)+'andtk.知识点='+quotedstr(zsd));            sql.add('andtk.难易度='+quotedstr(nyd)+            'andtk.课程号='+quotedstr(kcdm)+'orderbynewid()');            Open;            end;

注:关键就是orderbynewid()这条语句,随机因子就是从这里产生。

 

二、数据库为Access2000时生成随机记录的最好办法:

 

由于Access中没有newid()这一随机函数,故要想在Access中直接由SQL语句生成我们所希望的随机记录不太可能,因此我们只好在开发语言中生成合适SQL语句,让Access执行了。

//获取题库表中的随机ID,组成一个字符串,类似这样(3,8,2,25,49,1,7,10,6,83....)

 

//kcdm:课程代码,tx:题型,zsd:知识点,nyd:难易度,t_count:某一题型某一知识点某一难度下的要抽取的题量

 

functionTTest_Srv_RDataForm.Get_Random_ID            (constkcdm,tx,zsd,nyd,t_count:string):string;            var            sl:TStrings;            i,ii,kk:integer;            begin            try            Result:=';            sl:=TStringList.Create;            withTADOQuery.Create(nil)do            begin            try            Connection:=Adoconnection1;            SQL.Text:='selectIDfrom题库表            wherepidisnulland题型='+quotedstr(tx)+            'and知识点='+quotedstr(zsd)+'and难易度='+quotedstr(nyd)+            'and课程号='+quotedstr(Kcdm);            Open;            whilenotEofdo            begin            sl.Add(Fields[0].AsString);            Next;            end;            Close;            finally            Free;            end;            end;//endwith....            ifsl.Count=0then            Exit;            fori:=0toStrToIntDef(t_count,0)-1do            begin            kk:=sl.Count;//随机因子            Randomize;            ii:=Random(kk);//取得随机数            ifResult='then            Result:=sl.Strings[ii]            else            Result:=Result+','+sl.Strings[ii];            sl.Delete(ii);            //为了避免有可能出现的重复,此ID被抽取过后把它删了            ifsl.Count=0then            //如果无题可抽了退出循环            Break;            end;            Result:='('+Result+')';            //给结果串前后加上(......),最终形成(24,36,5,89,72,3,6,1....)的串样            finally            sl.Free;            end;            end;            //=================课程号,题型,知识点,难易度,题量            functionTTest_Srv_RDataForm.Get_Random_Sql            (constkcdm,tx,zsd,nyd,t_count:string):string;            begin            Result:=Get_Random_ID(kcdm,tx,zsd,nyd,t_count);            ifResult<>'then            Result:='selecttop'+t_count+'tk.ID,            标准答案from题库表tkwhereidin'+Result            else            Result:='selecttop'+t_count+'tk.ID,            标准答案from题库表tkwhere1=1';            end;            //以下为调用上述函数生成随机抽题的代码片断            .......            withtk_querydo            begin            Close;            sql.Clear;            sql.Text:=Get_Random_Sql(Kcdm,tx_str,zsd_str,nyd_str,txzsd_count_str);            Open;            end;
 
原创粉丝点击