1. 程式人生 > >【SQL】- 基礎知識梳理(四) - 存儲過程

【SQL】- 基礎知識梳理(四) - 存儲過程

var isp spl 更改 option fault 結果 特定 num

存儲過程的概念

存儲過程Procedure是一組為了完成特定功能的SQL語句集合,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名稱並給出參數來執行

存儲過程的好處

A、 存儲過程允許標準組件式編程
存儲過程創建後可以在程序中被多次調用執行,而不必重新編寫該存儲過程的SQL語句。而且數據庫專業人員可以隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提高了程序的可移植性。
B、 存儲過程能夠實現較快的執行速度
如果某一操作包含大量的T-SQL語句代碼,分別被多次執行,那麽存儲過程要比批處理的執行速度快得多。因為存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的存儲計劃。而批處理的T-SQL語句每次運行都需要預編譯和優化,所以速度就要慢一些。
C、 存儲過程減輕網絡流量
對於同一個針對數據庫對象的操作,如果這一操作所涉及到的T-SQL語句被組織成一存儲過程,那麽當在客戶機上調用該存儲過程時,網絡中傳遞的只是該調用語句,否則將會是多條SQL語句。從而減輕了網絡流量,降低了網絡負載。
D、 存儲過程可被作為一種安全機制來充分利用
系統管理員可以對執行的某一個存儲過程進行權限限制,從而能夠實現對某些數據訪問的限制,避免非授權用戶對數據的訪問,保證數據的安全。

存儲過程的語法

--------------創建存儲過程-----------------

CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]

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

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

--------------調用存儲過程----------------- EXECUTE Procedure_name ‘‘ --存儲過程如果有參數,後面加參數格式為:@參數名=value,也可直接為參數值value --------------刪除存儲過程----------------- drop procedure procedure_name --在存儲過程中能調用另外一個存儲過程,而不能刪除另外一個存儲過程

創建存儲過程的參數解釋
1.procedure_name :存儲過程的名稱,在前面加#為局部臨時存儲過程,加##為全局臨時存儲過程。

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

[email protected]: 存儲過程的參數。可以有一個或多個。用戶必須在執行過程時提供每個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多可以有 2.100 個參數。
使用 @ 符號作為第一個字符來指定參數名稱。參數名稱必須符合標識符的規則。每個過程的參數僅用於該過程本身;相同的參數名稱可以用在其它過程中。默認情況下,參數只能代替常量,而不能用於代替表名、列名或其它數據庫對象的名稱。有關更多信息,請參見 EXECUTE。

4.data_type:參數的數據類型。所有數據類型(包括 text、ntext 和 image)均可以用作存儲過程的參數。不過,cursor 數據類型只能用於 OUTPUT 參數。如果指定的數據類型為 cursor,也必須同時指定 VARYING 和 OUTPUT 關鍵字。有關 SQL Server 提供的數據類型及其語法的更多信息,請參見數據類型。
說明 對於可以是 cursor 數據類型的輸出參數,沒有最大數目的限制。

5.VARYING: 指定作為輸出參數支持的結果集(由存儲過程動態構造,內容可以變化)。僅適用於遊標參數。

6.default: 參數的默認值。如果定義了默認值,不必指定該參數的值即可執行過程。默認值必須是常量或 NULL。如果過程將對該參數使用 LIKE 關鍵字,那麽默認值中可以包含通配符(%、_、[] 和 [^])。

7.OUTPUT :表明參數是返回參數。該選項的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數可將信息返回給調用過程。Text、ntext 和 image 參數可用作 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以是遊標占位符。

8.RECOMPILE: 表明 SQL Server 不會緩存該過程的計劃,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。

9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復制的一部分發布。 說明 在升級過程中,SQL Server 利用存儲在 syscomments 中的加密註釋來重新創建加密過程。

10.FOR REPLICATION :指定不能在訂閱服務器上執行為復制創建的存儲過程。.使用 FOR REPLICATION 選項創建的存儲過程可用作存儲過程篩選,且只能在復制過程中執行。本選項不能和 WITH RECOMPILE 選項一起使用。

11.AS :指定過程要執行的操作。

12.sql_statement :過程中要包含的任意數目和類型的 Transact-SQL 語句。但有一些限制。

實戰創建存儲過程:

技術分享

針對上圖編寫一個帶輸入輸出參數的存儲過程:

if OBJECT_ID(proc_getTabe1Record,p) is not null
drop proc proc_getTabe1Record
go
create proc  proc_getTabe1Record
(
    @id int,    --默認輸入參數
    @name varchar(20) out,    --默認輸出參數
    @sex int output    --默認輸入輸出參數
)
as
    select @name=name,@sex=sex from table1 where [email protected] and sex=@sex;
go

測試調用下存儲過程:

declare @id int,
         @name varchar(20),
         @sex int;
set @id=1;
set @sex=1;
exec proc_getTabe1Record @id,@name out,@sex output;
select @name,@sex;
print cast(@sex as varchar(1))+|[email protected];

執行結果如下圖:

技術分享

附帶SQLServer數據庫的一些全局變量

技術分享
select APP_NAME ( ) as w --當前會話的應用程序

select @@IDENTITY   --返回最後插入的標識值 
select USER_NAME()    --返回用戶數據庫用戶名

SELECT @@CONNECTIONS  --返回自上次SQL啟動以來連接或試圖連接的次數。 
SELECT GETDATE() --當前時間 
SELECT @@CPU_BUSY/100  --返回自上次啟動SQL 以來 CPU 的工作時間,單位為毫秒

USE tempdb SELECT @@DBTS  as w  --為當前數據庫返回當前 timestamp 數據類型的值。這一 timestamp 值保證在數據庫中是唯一的。 
select @@IDENTITY as w --返回最後插入的標識值 
SELECT @@IDLE  as w  --返回SQL自上次啟動後閑置的時間,單位為毫秒 
SELECT @@IO_BUSY AS w   --返回SQL自上次啟動後用於執行輸入和輸出操作的時間,單位為毫秒 
SELECT @@LANGID AS w   --返回當前所使用語言的本地語言標識符(ID)。 
SELECT @@LANGUAGE AS w   --返回當前使用的語言名 
SELECT @@LOCK_TIMEOUT as w  --當前會話的當前鎖超時設置,單位為毫秒。 
SELECT @@MAX_CONNECTIONS  as w  --返回SQL上允許的同時用戶連接的最大數。返回的數不必為當前配置的數值 
EXEC sp_configure  --顯示當前服務器的全局配置設置 
SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 數據類型所用的精度級別,即該服務器中當前設置的精度。默認最大精度38。 
select @@OPTIONS  as w  --返回當前 SET 選項的信息。 
SELECT @@PACK_RECEIVED as w  --返回SQL自啟動後從網絡上讀取的輸入數據包數目。 
SELECT @@PACK_SENT as w  --返回SQ自上次啟動後寫到網絡上的輸出數據包數目。 
SELECT @@PACKET_ERRORS as w  --返回自SQL啟動後,在SQL連接上發生的網絡數據包錯誤數。 
SELECT @@SERVERNAME as w --返回運行SQL服務器名稱。 
SELECT @@SERVICENAME  as w --返回SQL正在其下運行的註冊表鍵名 
SELECT @@TIMETICKS  as w --返回SQL服務器一刻度的微秒數 
SELECT @@TOTAL_ERRORS AS w  --返回 SQL服務器自啟動後,所遇到的磁盤讀/寫錯誤數。 
SELECT @@TOTAL_READ  as w  --返回 SQL服務器自啟動後讀取磁盤的次數。 
SELECT @@TOTAL_WRITE as w  --返回SQL服務器自啟動後寫入磁盤的次數。 
SELECT @@TRANCOUNT  as w  --返回當前連接的活動事務數。 
SELECT @@VERSION as w  --返回SQL服務器安裝的日期、版本和處理器類型。
View Code

常用的系統存儲過程

技術分享
exec sp_databases; --查看數據庫
exec sp_tables; --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--約束
exec sp_stored_procedures;
exec sp_helptext sp_stored_procedures;--查看存儲過程創建、定義語句
exec sp_rename student, stuInfo;--修改表、索引、列的名稱
exec sp_renamedb myTempDB, myDB;--更改數據庫名稱
exec sp_defaultdb master, myDB;--更改登錄名的默認數據庫
exec sp_helpdb;--數據庫幫助,查詢數據庫信息
exec sp_helpdb master;
View Code

參考:http://www.cnblogs.com/knowledgesea/archive/2013/01/02/2841588.html

【SQL】- 基礎知識梳理(四) - 存儲過程