SQL Sever創(chuàng)建和使用存儲過程

須知:

注釋:

  • 單行:--
  • 多行:/* */

變量:

- 局部變量:

聲明
declare @sage int,@note char(30)
賦值
set @sage=20 /一次只能給一個變量賦值/
或 select @sage=20, @note='優(yōu)秀'
輸出
select @sage: 輸出變量的值。

- 全局變量

不需要聲明;不能賦值;@@開頭。

PRINT語句顯示信息:

PRINT @變量名1 [,……];

流程控制語句:

1. BEGIN … END語句(語句塊)

      BEGIN
         …
         SQL語句、流程控制語句
        …
       END;

2、條件控制語句

IF-ELSE,嵌套的IF

3、循環(huán)控制語句

WHILE循環(huán)

4、無條件轉移語句

GOTO lable

5、WAITFOR語句

WAITFOR {DELAY 時間|TIME 時間}

6、CASE語句

CASE WHEN… THEN… END

7、RETURN語句

RETURN 整型表達式

存儲過程的概念

存儲過程就是在SQL Server數(shù)據(jù)庫中存放的查詢,是存儲在服務器中的一組預編譯過的T-SQL語句,而不是在客戶機上的前端代碼中存放的查詢。

存儲過程優(yōu)點:

(1)存儲過程在服務器端運行,執(zhí)行速度快。存儲過程是預編譯過的,當?shù)谝淮握{用以后,就駐留在內(nèi)存中,以后調用時不必再進行編譯,因此,它的運行速度比獨立運行同樣的程序要快。
(2)簡化數(shù)據(jù)庫管理。例如,如果需要修改現(xiàn)有查詢,而查詢存放在用戶機器上,則要在所有的用戶機器上進行修改。而如果在服務器中集中存放查詢并作為存儲過程,則只需要在服務器上改變一次
(3)提供安全機制,增強數(shù)據(jù)庫安全性。通過授予對存儲過程的執(zhí)行權限而不是授予數(shù)據(jù)庫對象的訪問權限,可以限制對數(shù)據(jù)庫對象的訪問,在保證用戶通過存儲過程操縱數(shù)據(jù)庫中數(shù)據(jù)的同時,可以保證用戶不能直接訪問存儲過程中涉及的表及其他數(shù)據(jù)庫對象,從而保證了數(shù)據(jù)庫數(shù)據(jù)的安全性。另外,由于存儲過程的調用過程隱藏了訪問數(shù)據(jù)庫的細節(jié),也提高了數(shù)據(jù)庫中的數(shù)據(jù)安全性。
(4)減少網(wǎng)絡流量。如果直接使用T-SQL語句完成一個模塊的功能,那么每次執(zhí)行程序時都需要通過網(wǎng)絡傳輸全部T-SQL。若將其組織成存儲過程,這樣用戶僅僅發(fā)送一個單獨的語句就實現(xiàn)了一個復雜的操作,將大大減少網(wǎng)絡傳輸?shù)牡臄?shù)據(jù)量。

存儲過程的分類

在SQL Server中存儲過程主要分為兩類:系統(tǒng)存儲過程和用戶自定義存儲過程。
系統(tǒng)存儲過程主要存儲在resource數(shù)據(jù)庫中并以sp_為前綴,在任何數(shù)據(jù)庫中都可以調用,在調用時不必在存儲過程前加上數(shù)據(jù)庫名。
用戶自定義存儲過程由用戶自己根據(jù)需要而創(chuàng)建,是用來完成某項特定任務的存儲過程。

系統(tǒng)存儲過程

以字符 sp_ 開頭。
物理上存儲在資源數(shù)據(jù)庫(resource系統(tǒng)數(shù)據(jù)庫)中,但邏輯上出現(xiàn)在 每個系統(tǒng)數(shù)據(jù)庫和用戶定義數(shù)據(jù)庫的 sys 架構中。
可以從任何數(shù)據(jù)庫執(zhí)行系統(tǒng)存儲過程。

用戶自定義存儲過程

創(chuàng)建存儲過程

簡單的存儲過程類似于給一組SQL語句起個名字,然后就可以在需要時反復調用;復雜一些的則需要輸入和輸出參數(shù)。
創(chuàng)建存儲過程前,應注意下列幾個事項:
(1)存儲過程只能定義在當前數(shù)據(jù)庫中。
(2)存儲過程的名稱必須遵循標識符的命名規(guī)則。
(3)不要創(chuàng)建任何使用sp_作為前綴的存儲過程。
語法格式:

CREATE  PROC[EDURE]  procedure_name 
[@parameter  data_type [=default][OUTPUT]][,…]
AS 
  sql_statement

(1)procedure_name:存儲過程的名稱,并且在當前數(shù)據(jù)庫中必須唯一。
(2)@parameter:存儲過程的形參名。
(3)default:存儲過程輸入?yún)?shù)的默認值
(4)OUTPUT:指定輸出參數(shù)。此選項的值可以返回給調用EXECUTE的語句。
(5)sql_statement:存儲過程中的T-SQL語句。包括定義部分和執(zhí)行部分。

存儲過程的執(zhí)行

存儲過程創(chuàng)建成功后,保存在數(shù)據(jù)庫中。可以使用EXECUTE命令來直接執(zhí)行存儲過程。
語法格式:

[EXEC[UTE]] procedure_name  
  [value|@variable OUTPUT][,…]

(1)EXECUTE:執(zhí)行存儲過程的命令關鍵字,如果此語句是批處理的第一條語句,可以省略此關鍵字。
(2)procedure_name:存儲過程名稱。
(3)value為輸入?yún)?shù)提供實參值,@variable為一個已定義的變量,OUTPUT緊跟在變量后,說明該變量用于保存輸出參數(shù)返回的值
(4)當有多個參數(shù)時,彼此用逗號分隔。
例如:

EXECUTE  sp_helpdb

說明:關于EXEC[UTE]省略與否
如果執(zhí)行存儲過程是批處理中的第一條語句,可省略;
否則不能省略,必須包含 EXEC[UTE] 關鍵字。

創(chuàng)建基本存儲過程

創(chuàng)建一個存儲過程exp1 ,用于返回SC表中的所有記錄。

   CREATE  PROCEDURE  exp1
   AS
     SELECT  * 
     FROM   SC;

執(zhí)行存儲過程:

  EXEC  exp1;

創(chuàng)建帶輸入?yún)?shù)的存儲過程

創(chuàng)建一個存儲過程exp2 ,查詢指定學生的選課及成績信息。

   CREATE  PROCEDURE  exp2  @snum char(8) 
   AS
     SELECT  * 
     FROM  SC
     WHERE  SNO=@snum   ;

執(zhí)行存儲過程:

  EXEC  exp2  ‘20160001’ ;

創(chuàng)建一個存儲過程exp3,為SC表插入一個學生的課程及成績。

   CREATE  PROCEDURE  exp3
       @snum char(8),@cnum char(4),  @scgrade int
   AS
     INSERT  INTO SC
     VALUES (@snum,@cnum,@scgrade);

執(zhí)行存儲過程:

 EXEC   exp3  ‘20160001’,  ’0001’,  90

創(chuàng)建帶默認參數(shù)的存儲過程

創(chuàng)建存儲過程exp4,查詢指定學生的選課及成績信息,學生的學號要輸入 。學號默認值為=‘20160001’。

   CREATE   PROCEDURE  exp4  @snum char(8)=‘20160001’
   AS
     SELECT   *       
     FROM   SC      
     WHERE   SNO=@snum;

執(zhí)行存儲過程:

  EXEC exp4;
  EXEC exp4 ‘20160001’
  EXEC exp4 ‘20160089’

創(chuàng)建帶輸出參數(shù)的存儲過程

創(chuàng)建一個存儲過程exp5,求指定學生的總分并返回。

    CREATE PROCEDURE exp5
         @snum char(8),   @sumg int OUTPUT
    AS
    SELECT  @sumg=SUM(grade)       
    FROM  SC      
    WHERE  SNO=@snum;

執(zhí)行存儲過程:

DECLARE   @SG_SUM   int;    
EXEC   exp5   ‘20160001’,   @SG_SUM  output;
SELECT  @SG_SUM;

創(chuàng)建存儲過程GetDetailByName,查找指定學生(姓名)的學生信息。如指定學生不存在,則輸出“查無此人”。
方式一:

CREATE PROCEDURE GetDetailByName
  @sname char(8)
AS
  IF(SELECT COUNT(*) FROM XSDA WHERE 姓名=@sname)>0
    SELECT  *       
    FROM  XSDA      
    WHERE  姓名=@sname;
  ELSE
PRINT '查無此人'

方式二:

CREATE PROCEDURE GetDetailByName
  @sname char(8)
AS
  IF EXISTS(SELECT * FROM XSDA WHERE 姓名=@sname)
    SELECT  *       
    FROM  XSDA      
    WHERE  姓名=@sname;
  ELSE
    PRINT '查無此人'

方式三:(此方法判斷是否為空只能選擇單列,不能SELECT *)

CREATE PROCEDURE GetDetailByName
  @sname char(8)
AS
  IF((SELECT 姓名 FROM XSDA WHERE 姓名=@sname)is not null)
    SELECT  *       
    FROM  XSDA      
    WHERE  姓名=@sname;
  ELSE
    PRINT '查無此人'

執(zhí)行存儲過程:

EXEC GetDetailByName '王紅'

修改存儲過程

存儲過程的修改是由ALTER語句來完成的。
語法格式:

ALTER PROC[EDURE] procedure_name 
[@parameter  data_type [=default][OUTPUT]][,…]
AS sql_statement

其中,各參數(shù)的含義與CREATE PROCEDURE相同。
例如:重命名存儲過程

  ALTER Procedure 過程名1 RENAME TO 過程名2;

刪除存儲過程

T-SQL
語法格式:

   DROP PROC[EDURE] procedure_name [,…]
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容