Sql Server存儲過程和函數淺談


今天給大家總結一下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 ' 學生成績全部及格 '
View Code

 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
View Code

 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 ' 成績合格'
View Code

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
View Code

使用表結構

文章中用到了三張表,分別為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
View Code

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
View Code

調用函數語句:

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))
View Code

調用函數語句:

select * from course_student ('數據庫設計 ')
3.多聲明表值型函數
示例:創建函數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
View Code

調用函數語句:

select * from teacherinfo ('數據庫設計 ')

 

希望大家讀后不要有不適、嘔吐之感== 以上內容都是存儲過程、函數基礎知識,游標之類的沒有出現 本着步步為營原則,先把基礎的搞懂再說。我在這里主要起拋磚引玉的作用,希望各位同學能有一點收獲就好

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM