一、定義變量、順序、選擇、循環結構的應用
在查詢分析器中可以編寫代碼實現求1-100數中所有奇數之和,代碼如下:
declare @i int
declare @num int
set @num = 0
set @i = 1
while(@i<=100)
begin
if(@i%2=0)
begin
set@i = @i + 1
continue
end
set @num =@num + @i
set @i =@i + 1
end
print @num
根據上述題目,同學們試圖在查詢分析器中編程序求出所有的水仙花數(所謂水仙花數是一個三位數,其個位、十位、百位數字的三次方之和如果等於該數,則該數爲水仙花數,例如153=13+53+33)
二、觸發器的構建及使用
在使用觸發器之前,我們先建立一個關於學生基本信息及成績的數據庫,其邏輯結構如下所示:
問題說明:在插入一個學生的某一門課程的成績後、當刪除一個學生的成績信息後、在修改一個學生的某門課的成績後,都要在在班級表中更新該班級的總成績,這就需要在“學生選課表中建立“insert”、“delete”以及“update”觸發器,其代碼如下所示:
//delete型觸發器
CREATE TRIGGER [TRI_delete_sc] ON[dbo].[SC]
FOR Delete
AS
declare @sno varchar(8)
declare @CLANO varchar(8)
declare @grade dec(5,1)
select @sno = sno,@grade = grade fromdeleted
select @clano = clano from stu_info wheresno = @sno
update class set sumgrade = sumgrade -@grade where clano = @clano
//insert型觸發器
CREATE TRIGGER [TRI_insert_sc] ON[dbo].[SC]
FOR INSERT
AS
declare @sno varchar(8)
declare @CLANO varchar(8)
declare @grade dec(5,1)
select @sno = sno,@grade = grade frominserted
select @clano = clano from stu_info wheresno = @sno
update class set sumgrade = sumgrade +@grade where clano = @clano
//update型觸發器
CREATE TRIGGER [TRI_update_sc] ON[dbo].[SC]
FOR update
AS
declare @sno varchar(8)
declare @CLANO varchar(8)
declare @grade_ins dec(5,1)
declare @grade_del dec(5,1)
select @sno = sno,@grade_del = grade fromdeleted
select @grade_ins = grade from inserted
select @clano = clano from stu_info wheresno = @sno
set @grade_ins = @grade_ins - @grade_del
update class set sumgrade = sumgrade +@grade_ins where clano = @clano
根據以上代碼,請同學們自行編寫stu_info表的三種觸發器,實現class表中snum(學生人數)的自動更新。
三、存儲過程的構建及使用
存儲過程類似於函數,其作用爲實現一定的功能。例如,構建一個求兩個時間的時間差的存儲過程,代碼如下:
CREATE PROCEDURE CRT_DATE_DIFF @bgn_dt datetime,@end_dt datetime
--該存儲過程擁有兩個參數,即所謂的開始時間和結束時間
AS
select datediff(minute,@bgn_dt,@end_dt)
GO
在新建查詢中對存儲過程的調用採用如下方法:
execute 或exec
代碼如下:
declare @bgn_dt datetime
declare @end_dt datetime
set @bgn_dt = getdate()
set @end_dt = '2008-4-2 21:12:35.235'
exec CRT_DATE_DIFF @bgn_dt,@end_dt
顯示結果如下:
206
再例如,建立一個存儲過程,掃描學生選課表中某同學的成績,如果該學生的成績小於60分,則把該同學的成績加10分。所建立的存儲過程如下:
CREATE PROCEDURE Pro_update_grade @sno varchar(8)
AS
declare @grade dec(5,1)
declare @cno varchar(5)
declare cur_grade cursor for
selectgrade,cno from sc where sno = @sno
open cur_grade
fetch cur_grade into @grade,@cno
while @@fetch_status = 0
begin
if @grade< 60
begin
updateSC set grade = @grade + 10 where sno =@sno and cno = @cno
fetchcur_grade into @grade,@cno
end
end
close cur_grade
deallocate cur_grade
GO
在新建查詢中執行該存儲過程代碼如下:
exec Pro_update_grade '20002'
基於以上代碼,請同學們在學生選課表中尋找性別爲“女”的同學並把該同學的成績加10分。
注意:在本指導中的存儲過程其實用一條sql語句即可實現其功能,但爲了讓大家熟悉存儲過程以及遊標的使用方法,希望在實現上述功能時採用存儲過程和遊標的方法實現。