我自己遇到的一个随机无重复分配问题实例
网站需要一个随机无重复分配论文给不同专家评审的问题,要求每篇论文要有N个专家阅读,但是分配关系不能重复。
刚开始我确实是一点头绪也没有,本来是用C#在事件代码中写,各种循环嵌套,但是第三天早上的时候,突然想到,如果真正测试的时候数据多了,循环这么多层,相乘之后得执行很多次里面的插入存储过程,会很慢很慢,再加上测试点太远,所以果断舍弃这种做法。
然后我又上网各种找,发现游标。
说实话,我是完全0基础开始学习做网站,整套过程都得自学,因为是给老师做项目,学校项目通常都是给研究生做,所以本科生能有这个机会很不容易,我就零基础,硬着头皮上了。
mssql的知识还是不怎么完全,所以把游标研究了一下,然后把在C#中写的逻辑,在sql中重新捋了一遍,写完之后还是各种问题,主要是算法逻辑的问题,后来又改了几天,终于给写出来了。
我其实觉得.net挺强大的,那些控件的可编辑性挺高的,很方便。但是也觉得数据库的算法更NB,只是数据库的变通性不太好。现在应该说是出于纠结状态,我的习惯是把所以的算法都写到数据库,但是.net确实需要好好掌握掌握。
新手一个,还请大哥大师们多指教。
下面附上花了我好几天写出来的这个存储过程的代码:
1 USE [HLJSXKJSYYJSGLPT] 2 GO 3 /****** Object: StoredProcedure [dbo].[LWDelivery] Script Date: 04/24/2012 09:51:54 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 -- ============================================= 9 -- Author: <Author,,Name> 10 -- Create date: <Create Date,,> 11 -- Description: <Description,,> 12 -- ============================================= 13 ALTER PROCEDURE [dbo].[LWDelivery] 14 @xkdm char(7), 15 @yjsflm char(1), 16 @lwcount char(5), 17 @lwpsbl char(5) 18 19 AS 20 BEGIN 21 SET NOCOUNT ON; 22 23 declare @sql nvarchar(4000) 24 set @sql='declare @j int 25 set @j=0 26 declare @myLWDM char(20) 27 declare @myZJHM char(18) 28 declare @compareLWDM char(20) 29 declare @compareZJHM char(18) 30 if('''+@yjsflm+'''=''1'') 31 begin 32 declare zjhmcursor cursor scroll for select ZJHM from T_DS where XKDM='''+@xkdm+''' and LWPSZJ=''是'' 33 end 34 else 35 begin 36 declare zjhmcursor cursor scroll for select ZJHM from T_DS where XKDM='''+@xkdm+''' and LWPSZJ=''是'' and ZDGX!=''2'' 37 end 38 open zjhmcursor 39 while(@j<cast('+@lwpsbl+' as int)) 40 begin 41 declare lwdmcursor cursor scroll for select a.LWDM from(select top (cast('''+@lwcount+''' as int)) LWDM from T_LW where XKDM='''+@xkdm+''' and YJSFLM='''+@yjsflm+''' order by newid()) a 42 open lwdmcursor 43 fetch first from lwdmcursor into @myLWDM 44 while(@@FETCH_STATUS=0) 45 begin 46 fetch next from zjhmcursor into @myZJHM 47 if(@@FETCH_STATUS!=0) 48 begin 49 fetch first from zjhmcursor into @myZJHM 50 end 51 while(@@FETCH_STATUS=0) 52 begin 53 declare comparecursor cursor scroll for select LWDM, ZJHM from T_LWPS where XKDM='''+@xkdm+''' and YJSFLM='''+@yjsflm+''' 54 open comparecursor 55 fetch first from comparecursor into @compareLWDM, @compareZJHM 56 while(@@FETCH_STATUS=0) 57 begin 58 if(@myLWDM=@compareLWDM and @myZJHM=@compareZJHM) 59 begin 60 fetch next from zjhmcursor into @myZJHM 61 if(@@FETCH_STATUS=0) 62 begin 63 break 64 end 65 else 66 begin 67 fetch first from zjhmcursor into @myZJHM 68 break 69 end 70 end 71 else 72 begin 73 fetch next from comparecursor into @compareLWDM, @compareZJHM 74 end 75 end 76 close comparecursor 77 deallocate comparecursor 78 insert into T_LWPS(LWDM, ZJHM, XKDM, YJSFLM) values(@myLWDM, @myZJHM, '''+@xkdm+''', '''+@yjsflm+''') 79 fetch next from lwdmcursor into @myLWDM 80 if(@@FETCH_STATUS=0) 81 begin 82 fetch next from zjhmcursor into @myZJHM 83 if(@@FETCH_STATUS!=0) 84 begin 85 fetch first from zjhmcursor into @myZJHM 86 end 87 end 88 else 89 begin 90 break 91 end 92 end 93 end 94 close lwdmcursor 95 deallocate lwdmcursor 96 set @j=@j+1 97 end 98 close zjhmcursor 99 deallocate zjhmcursor'; 100 exec(@sql) 101 102 END