SQL Server儲存過程

2021-09-06 04:30:24 字數 4099 閱讀 5302

一,定義:sql server的儲存過程是乙個被命名的儲存在伺服器上的transacation-sql語句集合,是封裝重複性工作的一種方法.

二,儲存過程的優點:

1,重複使用。儲存過程可以重複使用,從而可以減少資料庫開發人員的工作量。

2,提高效能。儲存過程在建立的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的sql語句每執行一次就需要編譯一次,所以使用儲存過程提高了效率。

3,減少網路流量。儲存過程位於伺服器上,呼叫的時候只需要傳遞儲存過程的名稱以及引數就可以了,因此降低了網路傳輸的資料量。

4,安全性。引數化的儲存過程可以防止sql注入式的攻擊,而且可以將grant、deny以及revoke許可權應用於儲存過程。

三,語法,建立儲存過程:  

語法create proc[ edure ] [ owner.] procedure_name [;number ]

[ [ varying ] [=default ] [ output ]

] [,...n ]

[ with

] [ for replication ]

as sql_statement [ ...n ]

引數

owner

擁有儲存過程的使用者 id 的名稱。owner 必須是當前使用者的名稱或當前使用者所屬的角色的名稱。

procedure_name

新儲存過程的名稱。過程名必須符合識別符號規則,且對於資料庫及其所有者必須唯一。

;number

是可選的整數,用來對同名的過程分組,以便用一條 drop procedure 語句即可將同組的過程一起除去。例如,名為 orders 的應用程式使用的過程可以命名為orderproc;1、orderproc;2 等。drop procedureorderproc語句將除去整個組。如果名稱中包含定界識別符號,則數字不應包含在識別符號中,只應在 procedure_name 前後使用適當的定界符。

@parameter

過程中的引數。在 create procedure 語句中可以宣告乙個或多個引數。使用者必須在執行過程時提供每個所宣告引數的值(除非定義了該引數的預設值,或者該值設定為等於另乙個引數)。儲存過程最多可以有 2.100 個引數。

使用 @ 符號作為第乙個字元來指定引數名稱。引數名稱必須符合識別符號的規則。每個過程的引數僅用於該過程本身;相同的引數名稱可以用在其它過程中。預設情況下,引數只能代替常量,而不能用於代替表名、列名或其它資料庫物件的名稱。

data_type

引數的資料型別。除table之外的其他所有資料型別均可以用作儲存過程的引數。但是,cursor資料型別只能用於 output 引數。如果指定cursor資料型別,則還必須指定 varying 和 output 關鍵字。對於可以是cursor資料型別的輸出引數,沒有最大數目的限制。

varying

指定作為輸出引數支援的結果集(由儲存過程動態構造,內容可以變化)。僅適用於游標引數。

default

引數的預設值。如果定義了預設值,不必指定該引數的值即可執行過程。預設值必須是常量或 null。如果過程將對該引數使用 like 關鍵字,那麼預設值中可以包含萬用字元(%、_、 和 [^])。

output

表明引數是返回引數。該選項的值可以返回給 exec[ute]。使用 output 引數可將資訊返回給呼叫過程。textntextimage引數可用作 output 引數。使用 output 關鍵字的輸出引數可以是游標佔位符。 n

表示最多可以指定 2.100 個引數的佔位符。

recompile 表明 sql server 不會快取該過程的計畫,該過程將在執行時重新編譯。在使用非典型值或臨時值而不希望覆蓋快取在記憶體中的執行計畫時,請使用 recompile 選項。

encryption 表示 sql server 加密syscomments表中包含 create procedure 語句文字的條目。使用 encryption 可防止將過程作為 sql server 複製的一部分發布。

for replication

指定不能在訂閱伺服器上執行為複製建立的儲存過程。.使用 for replication 選項建立的儲存過程可用作儲存過程篩選,且只能在複製過程中執行。本選項不能和 with recompile 選項一起使用。

as指定過程要執行的操作。

sql_statement

過程中要包含的任意數目和型別的 transact-sql 語句。但有一些限制。 n

是表示此過程可以包含多條 transact-sql 語句的佔位符。

四,使用方法:

**********************************************

注:*所包圍部分來自ms的聯機叢書.

幾個例項

(ajaxcity表中內容)

id        cityname   short

1         蘇州市

sz  

2     無錫市     wx

3         常州市

cz1.選擇表中所有內容並返回乙個資料集

create procedure mysp_all

asselect * from ajaxcitygo

執行結果

2.根據傳入的引數進行查詢並返回乙個資料集

create procedure mysp_para

@cityname varchar(255),

@short    varchar(255)

asselect * from ajaxcity where

cityname=@cityname

and

short=@shortgo

執行結果

3.帶有輸出引數的儲存過程(返回前兩條記錄的id的和)

create procedure mysp_output

@sum int  output

asselect @sum=sum([id]) from (select top 2 * from ajaxcity) as tmptablego

執行結果

4.在儲存過程中使用游標

有這樣乙個表,儲存的是各超階級市下面的縣級市的資訊.如圖:

現在想統計出各個地級市下面的縣級市的個數,並組成乙個字串.結果應該是"5,2,2".

create procedure mysp_cursor

@result varchar(255) output//宣告輸出變數

asdeclare city_cursor cursor for//宣告游標變數

select [id] from ajaxcity

set @result=''

declare @field int//宣告臨時存放cityid的變數

open city_cursor //開啟游標

fetch next from city_cursor into @field//將實際id賦給變數

while(@@fetch_status=0)//迴圈開始

begin

if @result = ''

select @result = convert(nvarchar(2),count(*))  from ajaxcounty where

cityid=@field

else

select @result = @result + ',' + convert(nvarchar(2),count(*)) from ajaxcounty where

cityid=@field

fetch next from city_cursor into @field//下乙個cityid

endclose city_cursor//關閉游標

deallocate city_cursor//釋放游標引用go

執行結果

好了,關於儲存過程先寫到這裡.以上幾個例子基本上實現了平常所用到的大部分功能.至於複雜的儲存過程,所用到的知道主要是sql的語法,以及sql中內建函式的使用.已不屬於本文所要討論的範圍了.

sql server儲存過程

建立表的語句 create table student sno int primary key,sname nvarchar 30 sgentle nvarchar 2 sage int,sbirth smalldatetime,sdept nvarchar 30 drop table studen...

SQLSERVER儲存過程

sqlserver儲存過程使用說明書 引言首先介紹一下什麼是儲存過程 儲存過程就是將常用的或很複雜的工作,預先用 sql語句寫好並用乙個指定的名稱儲存起來,並且這樣的語句是放在資料庫中的,還可以根據條件執行不同 sql語句,那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫 ex...

SQL Server 儲存過程

儲存過程概念 儲存過程優點 儲存過程的介面 儲存過程的解析 編譯過程 儲存過程安全性 檢視儲存過程 加密 解密儲存過程 儲存過程概念 儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數 帶參儲存過程 來執行...