1 基礎數據
1 /*一 模擬數據說明:從2000年到當年,每年添加100個學生*/ 2 Declare @StuCount int, /*每年添加的數量*/ 3 @StartYear int,/*初始年份*/ 4 @CurYear int /*當前年份*/ 5 Begin 6 /*設置添加數據的初始值*/ 7 SET @StuCount=100 8 SET @StartYear=2010 9 SET @CurYear=YEAR(GETDATE())10 11 /*1 向學年表添加數據*/12 Declare @XnKaishi INT /*開始年份*/13 SET @XnKaishi=@StartYear14 WHILE(@XnKaishi<=@CurYear)15 BEGIN16 IF NOT EXISTS(SELECT 1 FROM SchoolYear WHERE SyStartYear=@XnKaishi AND SyEndYear=@XnKaishi+1)17 begin18 insert into SchoolYear(SyStartYear,SyEndYear) values(@XnKaishi,@XnKaishi+1)19 end20 SET @XnKaishi=@XnKaishi+121 END22 23 24 /*2 向學生表中添加數據*/25 Declare @temSc int, /*記錄當前的學生ID*/26 @temXueHao NVARCHAR(12),/*當前學生的編號*/27 @temXm nvarchar(20),/*學生的姓名*/28 @temSy int /*記錄當前的年份*/29 set @temSy=@StartYear30 /*循環年份*/31 WHILE(@temSy<=@CurYear)32 BEGIN33 /*循環添加該年份的學生*/34 set @temSc=135 while(@temSc<=@StuCount)36 begin37 set @temXueHao=CONVERT(varchar(4),@temSy)38 +'-'39 +CONVERT(varchar(4),@temSc)40 if not exists(select 1 from Student where StuNO=@temXueHao)41 begin42 set @temXm='學生'+CONVERT(varchar(4),@temSc)43 INSERT INTO Student(StuNO,StuName,StuJoinYear) VALUES(@temXueHao,@temXm,@temSy)44 end45 set @temSc=@temSc+146 end47 SET @temSy=@temSy+148 END 49 End50 51 GO52 53 /*二 模擬科目*/54 Declare @KcCount int /*課程數量*/55 BEGIN56 SET @KcCount=2057 DECLARE @i int,58 @kcMc nvarchar(30)59 set @i=160 while(@i<=@KcCount)61 begin62 set @kcMc='課程'+CONVERT(varchar(2),@i)63 if not exists(select 1 from Course where CourseName=@kcMc)64 begin65 insert into Course(CourseName) values(@kcMc)66 end67 set @i=@i+168 end69 END70 GO71 72 /*三 班級模擬:暫定三個年級,每個年級有三個班級*/73 Declare @GradeNo int=1,/*年級編號*/74 @ClassNo int=1,/*班級編號*/75 @GcName nvarchar(10)/*年級班級名稱*/76 BEGIN77 WHILE(@GradeNo<=3)78 BEGIN79 SET @ClassNo=180 WHILE(@ClassNo<=3)81 BEGIN82 SET @GcName=CONVERT(varchar(1),@GradeNo)+'年級'+CONVERT(varchar(1),@ClassNo)+'班級'83 if not exists(select 1 from GradeClass where GradeNo=@GradeNo and ClassNo=@ClassNo)84 begin85 INSERT INTO GradeClass(GradeNo,ClassNo,GcName) values(@GradeNo,@ClassNo,@GcName)86 end87 SET @ClassNo=@ClassNo+188 END89 set @GradeNo=@GradeNo+190 END91 END92 GO
2 注冊課程數據
1 /*2 模擬CourseRegist(課程注冊表)的數據*/ 2 3 --Declare @MixRegCount int=5,/*每學年允許的最小注冊課程數*/ 4 -- @MaxRegCount int=12/*每學年運行的最大注冊課程數*/ 5 BEGIN 6 /*1 臨時表:#TemPReg用于中間的數據*/ 7 if object_id('tempdb..#TempReg') is not null 8 BEGIN 9 drop table #TempReg 10 END 11 SELECT * INTO #TempReg FROM CourseRegist where 1=2 12 13 INSERT INTO #TempReg(StuNO,SyID,CourseID) 14 SELECT Student.StuNO, 15 SchoolYear.SyID, 16 Course.CourseID 17 FROM Student 18 CROSS JOIN SchoolYear 19 CROSS JOIN Course; 20 21 /*2 刪除掉非法的數據*/ 22 DELETE #TempReg from #TempReg T1 23 WHERE EXISTS 24 ( 25 SELECT * FROM 26 ( 27 /*這些記錄都是不合法的記錄*/ 28 SELECT T.CRID, /*成績表ID*/ 29 T.StuNO,/*學號*/ 30 Student.StuJoinYear,/*入學年份*/ 31 SchoolYear.SyStartYear,/*學年開始年份*/ 32 SchoolYear.SyEndYear /*學年結束年份*/ 33 FROM #TempReg T 34 LEFT JOIN Student on Student.StuNO=T.StuNO 35 LEFT JOIN SchoolYear ON SchoolYear.SyID=T.SyID 36 where Student.StuJoinYear>SchoolYear.SyStartYear /*入學年份大于學年開始年份*/ 37 OR SchoolYear.SyStartYear>YEAR(GETDATE())/*該學年還沒有到*/ 38 /*該學年還沒有過完。新學年從本年的9月1號到第二年的6月30號*/ 39 OR(GETDATE() BETWEEN 40 CONVERT(datetime,convert(varchar(4),SchoolYear.SyStartYear)+'-09-01') 41 AND 42 CONVERT(datetime,convert(varchar(4),SchoolYear.SyEndYear)+'-06-30') 43 ) 44 OR SchoolYear.SyStartYear>=Student.StuJoinYear+3/*學生入學年限已到了3年,即已畢業了*/ 45 ) T2 46 WHERE T2.CRID=T1.CRID 47 ); 48 49 /*3 隨機刪除注冊信息:之所以做這一步是因為并非每個學生都注冊所有的課程*/ 50 DECLARE @SyID int, 51 @StuNO NVARCHAR(12), 52 @topNum int,/*隨機取出的課程數量*/ 53 @DeleteSql varchar(2000) /*用于隨機刪除的語句*/ 54 /*第一個游標CUR_SY:用于取學年ID*/ 55 DECLARE CUR_SY CURSOR FOR SELECT SyID FROM SchoolYear 56 open CUR_SY 57 fetch next from CUR_SY into @SyID 58 59 while (@@fetch_status=0) 60 BEGIN 61 /*第二個游標CUR_STU:用于取學生表編號*/ 62 DECLARE CUR_StuNO CURSOR FOR SELECT StuNO FROM Student 63 open CUR_StuNO 64 fetch next from CUR_StuNO into @StuNO 65 66 while(@@fetch_status=0) 67 begin 68 IF EXISTS(SELECT 1 FROM #TempReg WHERE StuNo=@StuNO and Syid=@SyID) 69 BEGIN 70 /*隨機刪除注冊課程*/ 71 select @topNum=cast(ceiling(rand() * (SELECT COUNT(1) FROM Course)) as int) 72 SET @DeleteSql=N'DELETE #TempReg ' 73 +N' WHERE StuNo='''+@StuNO 74 +''' and Syid='+convert(varchar(2),@SyID) 75 +' AND CourseID not IN (SELECT TOP '+convert(varchar(2),@topNum)+' CourseID FROM Course ORDER BY NEWID())' 76 exec (@DeleteSql) 77 END 78 fetch next from CUR_StuNO into @StuNO 79 end 80 close CUR_StuNO 81 deallocate CUR_StuNO 82 83 fetch next from CUR_SY into @SyID 84 END 85 close CUR_SY 86 deallocate CUR_SY 87 88 /*4 把處理好的臨時表信息放到物理表中*/ 89 Merge into CourseRegist CR 90 using 91 ( 92 select StuNO, 93 SyID, 94 CourseID 95 from #TempReg 96 ) T 97 ON CR.StuNO=T.StuNO 98 AND CR.SyID=T.SyID 99 AND CR.CourseID=T.CourseID100 WHEN NOT MATCHED THEN INSERT (StuNO,SyID,CourseID) VALUES(T.StuNO,T.SyID,T.CourseID);101 END
3 成績數據
1 /*三 模擬成績*/ 2 3 /*模擬成績要注意: 4 1 成績都是隨機生成的,使用floor(rand()*100) 5 2 當前假設學生經歷3個學年需要畢業,所以只能在3個學年有成績。 6 如入學年份2012年,則只能在2012-2013學年,2013-2014學年,2014-2015學年有成績 7 但當前2014-2015學年還沒有過完,所以2014-2015學年亦沒有成績 8 3 該表中的學號、課程ID、學年ID來自于CourseRegist表 9 */10 Merge into Score USING11 (12 SELECT StuNO,13 SyID,14 CourseID,15 CASE 16 /*超過一百分則使用100分減去40范圍之內的隨機數,保證分數在60至100之間*/17 WHEN ScoreValue>=100 THEN 100-cast(ceiling(rand(checksum(newid()))*40) as int) 18 ELSE ScoreValue19 END AS ScoreValue20 FROM21 (22 /*組合最初的數據*/ 23 SELECT StuNO,SyID,CourseID,24 /*之所以隨機數乘以500,是為了避免有過多的不及格的分數*/25 cast(ceiling(rand(checksum(newid()))*500) as int) AS ScoreValue,26 /*KeepFlag:保留標記位。*/27 cast(ceiling(rand(checksum(newid()))*10) as int) AS KeepFlag 28 FROM CourseRegist29 ) A where KeepFlag>1 /*保留十分之九的數據*/30 ) B31 ON Score.StuNO=B.StuNO 32 AND Score.SyID=B.SyID 33 AND Score.CourseID=B.CourseID 34 WHEN NOT MATCHED T
新聞熱點
疑難解答