我自己遇到的一个随机无重复分配问题实例

网站需要一个随机无重复分配论文给不同专家评审的问题,要求每篇论文要有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

转载于:https://www.cnblogs.com/captain7/archive/2012/04/26/2470970.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值