MSSQL存儲進程進修筆記一 關於存儲進程。本站提示廣大學習愛好者:(MSSQL存儲進程進修筆記一 關於存儲進程)文章只能為提供參考,不一定能成為您想要的結果。以下是MSSQL存儲進程進修筆記一 關於存儲進程正文
1、 存儲進程的概念,長處,語法
在寫筆記之前,起首須要整頓好這些概念性的器械,不然的話,就會在概念上發生生疏或許是混雜的感到。
概念:將經常使用的或許是很龐雜的任務,事後應用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; --檢查依附關系
2、存儲進程進階
固然了,說先來講明下存儲進程的格局語律例則:
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在一步一步的進修中,堅實的生長起來。