須知:
注釋:
- 單行:--
- 多行:/* */
變量:
- 局部變量:
聲明:
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 [,…]