程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> MSSQL存儲過程學習筆記一 關於存儲過程

MSSQL存儲過程學習筆記一 關於存儲過程

編輯:更多數據庫知識

一、 存儲過程的概念,優點,語法
在寫筆記之前,首先需要整理好這些概念性的東西,否則的話,就會在概念上產生陌生或者是混淆的感覺。
概念:將常用的或者是很復雜的工作,預先利用SQL語句寫好並用一個指定的名稱存儲起來,那麼以後要是調用這些SQL語句的時候,只需要利用Execute/Exec執行以下,即可。
優點:當然了,使用存儲過程的優點是很多的,下面來一一說明。
1、 存儲過程只是在創造的時候進行編譯,以後每次執行的時候,就不需要編譯了,但是直接利用SQL的話,需要每次運行的時候都重新編譯一次,所以使用存儲過程可以提高數據庫的執行速度。
2、 當對數據庫進行復雜操作的時候,利用存儲過程進行封裝,可以減少代碼出錯的幾率,並且MSSQL本身具有代碼調試能力,可以很容易的定位到出錯的語句。
3、 存儲過程可以重復使用,可以提高開發人員的開發效率。
4、 安全性高,可以設定只有特定權限的用戶對存儲過程進行操作;也可以在一定的程度上預防SQL注入操作。
種類:存儲過程分為三類,分別為系統存儲過程、擴展存儲過程、用戶自定義存儲過程。
1、 系統存儲過程:就是以SP_開頭的存儲過程,用來進行系統的各種設定,取得信息,進行相關的管理工作等等;如:sp_help就是取得指定對象的相關信息。
2、 擴展存儲過程:就是以XP_開頭的,用來調用操作系統提供的功能。以下為引用的內容:exec master..xp_cmdshell ‘ping 127.0.0.1'
3、 用戶自定義的存儲過程:
常用格式如下:
復制代碼 代碼如下:
Create procedure procedue_name
  [@parameter data_type][output]
  [with]{recompile|encryption}
  as
  sql_statement

需要說明的就是:
output:表明此參數是可以回傳的。
[with]{recompile|encryption}中的recompile:表明每次執行此存儲過程的時候,都重新編譯一次(默認情況下只有在創建的時候才進行編譯)。
encryption:所創建的存儲過程的內容會被加密。
小技巧:在這裡需要說明的是,如果我們有時候要在數據庫中查找所有包含A關鍵字的表的列的名稱,那麼該如何尋找呢?可以利用下面的語句:
復制代碼 代碼如下:
select table_name,column_name from INFORMATION_SCHEMA.COLUMNSwhere COLUMN_NAME like '%A%'; --查看那些表含有包含A的列

但是如果想在存儲過程找存在表“B”的存儲過程的名稱,該如何做呢,可以利用下面的語句來進行:
復制代碼 代碼如下:
select routine_name, routine_definition from information_schema.routines
where routine_definition like '%B%'
and routine_type='procedure'

當然了,我們其實還可以利用SQL中的syscomments,sysobjects,sysdepends來查看具體的數據信息,這個和oracle中的dba_objects等很像:
復制代碼 代碼如下:
select * from syscomments; --查看標注
select * from sysobjects; --查看數據庫對象
select * from sysdepends; --查看依賴關系

二、存儲過程進階
當然了,說先來說明下存儲過程的格式語法規則:
復制代碼 代碼如下:
Create Procedure Procedure-name ( Input parameters , Output Parameters (If required))AsBegin Sql statement used in the stored procedureEnd

在這裡我們利用一個普通的例子來說明:
復制代碼 代碼如下:
/* Getstudentname is the name of the stored procedure*/
Create PROCEDURE Getstudentname(
@studentid INT --Input parameter , Studentid of the student
)
AS
BEGIN
SELECT Firstname+' '+Lastname FROM tbl_Students WHERE studentid=@studentid
END

當然了,這裡的@studentid參數只是一個傳入的參數,但是如果想回傳一個值,那麼就需要利用到out參數來實現,具體的實現代碼如下:
復制代碼 代碼如下:
/*
GetstudentnameInOutputVariable is the name of the stored procedure which
uses output variable @Studentname to collect the student name returns by the
stored procedure
*/
Create PROCEDURE GetstudentnameInOutputVariable
(
@studentid INT, --Input parameter , Studentid of the student
@studentname VARCHAR(200) OUT -- Out parameter declared with the help of OUT keyword
)
AS
BEGIN
SELECT @studentname= Firstname+' '+Lastname FROM tbl_Students WHERE studentid=@studentid
END

從上面的代碼,可以看出out參數的具體用法,但是如果想在SQL服務器端執行這段代碼,那該如何進行呢?
其實,一說到這,稍微麻煩一點,如果是只有in參數,那麼只需要利用execute/exec 後面加上存儲過程的名稱,裡面給參數賦值即可;但是如果不僅有in參數,而且有out參數,這個該怎麼來弄呢?
下面通過一個具體的實例來詳細的描述用法:
復制代碼 代碼如下:
Alter PROCEDURE GetstudentnameInOutputVariable
(
@studentid INT, --Input parameter , Studentid of the student
@studentname VARCHAR (200) OUT, -- Output parameter to collect the student name
@StudentEmail VARCHAR (200)OUT -- Output Parameter to collect the student email
)
AS
BEGIN
SELECT @studentname= Firstname+' '+Lastname,
@StudentEmail=email FROM tbl_Students WHERE studentid=@studentid
END

可以看出,上面的存儲過程有三個參數,其中第一個是IN參數,而後兩個是OUT參數,從過程主體可以看出,第一個out參數就是得到學生全名,第二個則是得到email的。
那麼如何在服務器端查看執行後得到的結果呢?
復制代碼 代碼如下:
Declare @Studentname as nvarchar(200) -- 申明第一個輸出參數
Declare @Studentemail as nvarchar(50) -- 申明第二個輸出參數
Execute GetstudentnameInOutputVariable 1 , @Studentname output, @Studentemail output
Select @Studentname,@Studentemail --“select”語句可以查看結果

好了,上面就是存儲過程方面的一些知識,後續文章將會將游標,自定義錯誤,事物運行給包括進來,希望SQL在一步一步的學習中,堅實的成長起來。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved