今天給大家總結一下sql server中的存儲過程和函數。本人是小白,里面內容比較初級,大神不喜勿噴 自行飄過就是。。
首先給大家簡單列出sql server中的流控制語句,后面會用到的^_^
sql server常用控制語句
1.begin..end語句:該語句用來定義一串由順序執行的SQL語句構成的塊。
begin statement block end
2.if....else語句:該語句用來定義有條件執行的某些語句。
if boolen_expression statement [else [if boolean_expression] statement]
示例:查詢學號為9704學生的成績狀況

if ( select min (mark) from student where sno= '9704') > 90 print ' 學生成績全部優秀 ' else if ( select min (mark) from student where sno= '9704') >60 print ' 學生成績全部及格 ' else print ' 學生成績全部及格 '
3.while、break和continue語句:寫過程序的同學相比對這個並不陌生,直接上代碼
示例:學號為9705學生的平均成績如果小於75,則將該學生的每門成績以5%的比例提高,當平均成績大於等於75或者所有課程都及格時,終止操作。

while(select avg( mark) from student) < 75 begin update student set mark= mark*1.05 if(select min( mark) from student) >=60 break end
4.declare語句:用來定義一個局部變量,可用select語句為該變量賦初值。這個變量必須用@開頭,跟着一個標識符
declare @variable_name datatype [,@variable_name datatype]....
示例:查詢學號為9704學生的成績狀況

declare @verygood int select @verygood = min( mark) /*使用select 賦值*/ from student where sno= '9704' if @verygood > 60 print ' 成績合格'
5.return語句:用來無條件地退出一個查詢或一個過程。
return [int_expression]
6.waitfor語句:用來定義某天中的一個時刻,執行一個語句塊。 語法如下
waitfor {delay 'time'| time 'time'} 注:delay后的time表示等待多長時間執行sql語句;time后的time說明在time時間點執行sql語句
示例:在下午15:41執行存儲過程update_all_stats

begin waitfor time '15:41' execute update_all_stats end
使用表結構
文章中用到了三張表,分別為student(學生信息表)、teacher(教師信息表)、course(課程信息表) ,表結構請看下方



存儲過程
初印象:存儲過程是由SQL語句和控制語句構成的語句串(語句集合)。它不僅可以帶有輸入參數還可以帶有輸出參數,存儲過程能夠通過接收參數,向調用者返回結果集,結果集的格式由調用者確定。返回狀態值給調用者,指明調用成功還是失敗,包括針對數據庫的操作語句,並且可以在一個存儲過程中調用另一存儲過程。 另外存儲過程好處不必多說,比如支持sql重用、執行速度快、減少網絡流量、安全可靠。
在sql server中存儲過程分為兩類:系統提供存儲過程和用戶自定義存儲過程。 系統存儲過程主要存儲在master數據庫中,並以sp_為前綴,主要是從系統表中獲取信息;用戶存儲過程由用戶創建並完成特定功能,這里我主要寫的是用戶存儲過程
1. 創建存儲過程
sql server中使用create procedure語句創建、編譯存儲過程。
語法如下:
create procedure procedure_name [;version number] [{ @parameter data_type} [varying] [=default value][output] ] [,...n] [with {recompile|encryption|recompile,encryption}] [for replication] as sql_statement [...n]
解釋:
- procedure_name是存儲過程的名稱,最多可有128個字符;
- version number為版本號
- @parameter是存儲過程參數名。可以聲明一個或多個參數,當調用該存儲過程時,除非定義了參數缺省值,用戶必須給出所有的參數值。一個存儲過程至多有1024個參數,參數可以用作存儲過程中的變量名,但參數不能用作列名、表名或其他數據庫對象的名稱
- data_type是參數的數據類型。在存儲過程中所有的數據類型都可被用作參數,但是如果參數為游標(cursor)數據類型,則該參數必須被指定為varing和output。
- varying指定由output參數支持的結果集,僅應用於游標參數。
- default value是指參數的缺省值。
- output表明該參數是一個返回參數。用output參數可以向調用者返回信息,該參數在存儲過程中可以變化,但是Text類型參數不能用作output參數。
- recompile指明sql server並不保存該存儲過程的執行計划,該存儲過程每執行一次都要重新編譯。默認每次調用時都使用同一計划
- encryption為syscomments表中存儲過程條目加密,防止用戶查看編譯后的語句。
- for replication選項指明了該存儲過程只能在復制過程中執行
- sql_statement是包含在存儲過程中的任何數量和類型的sql語句
示例:創建存儲過程usp_select_teacher,查詢特定系的教師的信息,判定教師的年齡結構,並將該系教師的平均年齡和最大年齡傳遞給用戶。

create procedure usp_select_teacher @depart char( 10),@avg_age int output,@max_age int output as select * from teacher where dname= @depart select @max_age= max(age ) from teacher where dname= @depart select @avg_age= avg(age ) from teacher where dname= @depart if @avg_age <= 30 select ' 年齡結構'= '年齡結構偏年輕', '平均年齡' =@avg_age if @avg_age > 30 and @avg_age <=40 select ' 年齡結構'= '年齡結構合理', '平均年齡' =@avg_age if @avg_age > 40 select ' 年齡結構'= '年齡結構偏大', '平均年齡' =@avg_age
2.調用存儲過程
sql server使用execute命令調用存儲過程
示例:調用存儲過程usp_select_teacher,並查看其輸出參數的值。
declare @avgage int ,@maxage int execute usp_select_teacher ' 計算機', @avgage output, @maxage output
我的運行結果如下:

SQL函數
初印象:當要執行一段語句,產生單一值或表時,可使用自定義函數而不是存儲過程。與存儲過程不同,自定義函數只能返回單一值或表。此外,函數不能執行insert、update和delete操作。在SQL server中,根據函數返回值形式的不同,將用戶自定義函數分為3種類型。
- 標量型函數(Scalar Function):返回一個確定類型的標量值。
- 內聯表值型函數(Inline Table-valued Function):以表的形式返回一個返回值,即返回的是一個表,相當於一個參數化的視圖
- 多聲明表值型函數(Multi-statement Table-Valued Function):可以看做標量型和內聯表值型函數的結合體。返回值是一個表,但它和標量型函數一樣,有一個begin-end語句括起來的函數體,該函數體包含插入語句,向返回表中插入數據。
下面給出各種類型的示例代碼
1.標量型函數
示例:創建工齡工資計算函數year_wage,共有3個輸入參數:工作時間(work_date),當前時間(now_date),工齡工資標准(per_wage).

create function year_wage(@work_date datetime, @now_date datetime,@per_wage decimal) returns decimal as begin return (( year(@now_date )-year( @work_date)) * @per_wage) end
調用函數語句:
select dbo. year_wage ('2014-10-01' ,getdate(), 12) as ' 工齡工資'
2.內聯表值型函數
示例:創建函數course_student,能夠顯示student表中選修了某門課程(課程名稱)的所有學生的信息。 代碼如下:

create function course_student(@course_name varchar(20 )) returns table as return ( select s.* from student as s,course as c where s. cno=c .cno and c.cno in(select cno from course where cname= @course_name))
調用函數語句:
select * from course_student ('數據庫設計 ')
示例:創建函數teacherInfo,用於查詢指定系的教師的姓名、性別、所在系、所授課程的課程號、課程名以及學時信息。

create function [dbo].[TeacherInfo] (@depart varchar (20)) returns @TeacherInfo table (T_name varchar (8), T_sex char( 2), T_dname varchar( 20), T_cno int primary key , T_cname varchar( 20), t_ctime int) as begin insert @TeacherInfo select T. TNAME,T .TSEX, T.DNAME ,T. CNO,C .CNAME, C.CTIME FROM TEACHER AS T,COURSE AS C WHERE C. CNO=T .CNO AND T. CNO IN (SELECT CNO FROM TEACHER WHERE DNAME=@depart ) return end
調用函數語句:
select * from teacherinfo ('數據庫設計 ')
希望大家讀后不要有不適、嘔吐之感== 以上內容都是存儲過程、函數基礎知識,游標之類的沒有出現 本着步步為營原則,先把基礎的搞懂再說。我在這里主要起拋磚引玉的作用,希望各位同學能有一點收獲就好