日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

【转】SQL SERVER 存储过程学习笔记

發布時間:2023/12/9 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】SQL SERVER 存储过程学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://www.cnblogs.com/nina-piaoye/archive/2006/09/18/507183.html

將常用的或很復雜的工作,預先用SQL語句寫好并用一個指定的名稱存儲起來, 那么以后要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。

????????????????? 存儲過程的優點

??? 1.存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
??? 2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
??? 3.存儲過程可以重復使用,可減少數據庫開發人員的工作量
????4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權

?????????????????????? 創建存儲過程
*************************************************

語法
CREATE PROC[ EDURE ] [ owner. ] procedure_name [ ; number ]
????[ { @parameter data_type }

????????[ VARYING ] [ = default ] [ OUTPUT ]

????
] [ ,...n ]

[ WITH
????{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

參數

owner

??? 擁有存儲過程的用戶 ID 的名稱。owner 必須是當前用戶的名稱或當前用戶所屬的角色的名稱。

procedure_name

??? 新存儲過程的名稱。過程名必須符合標識符規則,且對于數據庫及其所有者必須唯一。

;number

??? 是可選的整數,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應用程序使用的過程可以命名為 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 語句將除去整個組。如果名稱中包含定界標識符,則數字不應包含在標識符中,只應在 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 | ENCRYPTION | RECOMPILE, ENCRYPTION}

????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?????????常州市?????CZ

1.選擇表中所有內容并返回一個數據集

??????? CREATE PROCEDURE mysp_All
??????? AS
?????????? select * from AjaxCity
????????GO

執行結果

???????

2.根據傳入的參數進行查詢并返回一個數據集

???????CREATE PROCEDURE mysp_para
??????????? @CityName varchar(255),

??????????? @Short??? varchar(255)
?????? AS
???????? select * from AjaxCity where
CityName=@CityName?And Short=@Short
?????? GO

執行結果

???????

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

CREATE PROCEDURE mysp_output
?????? @SUM int? output
?AS
?????? select @SUM=sum([ID]) from (select top 2 * from AjaxCity) as tmpTable
GO

執行結果

????????

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

??有這樣一個表,存儲的是各超階級市下面的縣級市的信息.如圖:

??

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

?

CREATE PROCEDURE mysp_Cursor
??? @Result varchar(255) output//聲明輸出變量
AS
??? declare 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
end
close city_cursor//關閉游標
deallocate city_cursor//釋放游標引用
GO

?

執行結果

??????

?

??? 好了,關于存儲過程先寫到這里.以上幾個例子基本上實現了平常所用到的大部分功能.至于復雜的存儲過程,所用到的知道主要是SQL的語法,以及SQL中內置函數的使用.已不屬于本文所要討論的范圍了.

轉載于:https://www.cnblogs.com/wzc998/archive/2010/09/27/1836793.html

總結

以上是生活随笔為你收集整理的【转】SQL SERVER 存储过程学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。