SQLServer存儲過程學習記錄


簡單來說,存儲過程就是一條或者多條sql語句的集合,可視為批處理文件,但是其作用不僅限於批處理。

一、存儲過程的概述

SQL Server中的存儲過程是使用T_SQL編寫的代碼段。它的目的在於能夠方便的從系統表中查詢信息,或者完成與更新數據庫表相關的管理任務和其他的系統管理任務.T_SQL語句是SQL Server數據庫與應用程序之間的編程接口。在很多情況下,一些代碼會被開發者重復編寫多次,如果每次都編寫相同功能的代碼,不但繁瑣,而且容易出錯,而且由於SQL Server逐條的執行語句會降低系統的運行效率。

 簡而言之,存儲過程就是SQL Server為了實現特定任務,而將一些需要多次調用的固定操作語句編寫成程序段,這些程序段存儲在服務器上,有數據庫服務器通過程序來調用。

存儲過程的優點:

  1. 存儲過程加快系統運行速度,存儲過程只在創建時編譯,以后每次執行時不需要重新編譯。
  2. 存儲過程可以封裝復雜的數據庫操作,簡化操作流程,例如對多個表的更新,刪除等。
  3. 可實現模塊化的程序設計,存儲過程可以多次調用,提供統一的數據庫訪問接口,改進應用程序的可維護性。
  4. 存儲過程可以增加代碼的安全性,對於用戶不能直接操作存儲過程中引用的對象,SQL  Server可以設定用戶對指定存儲過程的執行權限。
  5. 存儲過程可以降低網絡流量,存儲過程代碼直接存儲於數據庫中,在客戶端與服務器的通信過程中,不會產生大量的T_SQL代碼流量。

存儲過程的缺點:

  1. 數據庫移植不方便,存儲過程依賴與數據庫管理系統, SQL Server 存儲過程中封裝的操作代碼不能直接移植到其他的數據庫管理系統中。
  2. 不支持面向對象的設計,無法采用面向對象的方式將邏輯業務進行封裝,甚至形成通用的可支持服務的業務邏輯框架.
  3. 代碼可讀性差,不易維護。不支持集群。

  說一下自己對存儲過程的理解:對於SQLServer中的存儲過程,和C#中的函數和相似,可以理解為一個函數,可以給存儲過程攜帶參數,可以有返回值,可以帶有output參數,也可以讓參數帶默認值。這樣子理解可以讓自己快速理解存儲過程

二、存儲過程的分類

  1.系統存儲過程

  系統存儲過程是 SQL Server系統自身提供的存儲過程,可以作為命令執行各種操作。

  系統存儲過程主要用來從系統表中獲取信息,使用系統存儲過程完成數據庫服務器的管理工作,為系統管理員提供幫助,為用戶查看數據庫對象提供方便,系統存儲過程位於數據庫服務器中,並且以sp_開頭,系統存儲過程定義在系統定義和用戶定義的數據庫中,在調用時不必在存儲過程前加數據庫限定名。例如:sp_rename系統存儲過程可以修改當前數據庫中用戶創建對象的名稱,sp_helptext存儲過程可以顯示規則,默認值或視圖的文本信息,SQL SERVER服務器中許多的管理工作都是通過執行系統存儲過程來完成的,許多系統信息也可以通過執行系統存儲過程來獲得。

  系統存儲過程創建並存放在與系統數據庫master中,一些系統存儲過程只能由系統管理員使用,而有些系統存儲過程通過授權可以被其它用戶所使用。

  2.用戶存儲過程(自定義存儲過程)

  自定義存儲過程即用戶使用T_SQL語句編寫的、為了實現某一特定業務需求,在用戶數據庫中編寫的T_SQL語句集合,自定義存儲過程可以接受輸入參數、向客戶端返回結果和信息,返回輸出參數等。創建自定義存儲過程時,存儲過程名前加上"##"表示創建了一個全局的臨時存儲過程;存儲過程前面加上"#"時,表示創建的局部臨時存儲過程。局部臨時存儲過程只能在創建它的回話中使用,會話結束時,將被刪除。這兩種存儲過程都存儲在tempdb數據庫中。

  用戶定義的存儲過程分為兩類:T_SQL 和CLR

    T_SQL:存儲過程是值保存的T_SQL語句集合,可以接受和返回用戶提供的參數,存儲過程也可能從數據庫向客戶端應用程序返回數據。

    CLR存儲過程是指引用Microsoft.NET Framework公共語言的方法存儲過程,可以接受和返回用戶提供的參數,它們在.NET Framework程序集是作為類的公共靜態方法實現的。

三、存儲過程的創建

  准備數據 如下:

use Test;
--創建測試books表
create table Money (
    id int identity(1,1) primary key,
    money int
);

  里面插入若干條測試數據

  1.創建一個無參存儲過程

if exists(select * from sysobjects where name='usp_getAllMoneyInfo')
drop proc usp_getAllMoneyInfo
go
--存儲過程相當於一個函數 可以有參數,輸出參數 as后為方法體 使用return進行返回--
create proc usp_getAllMoneyInfo
--as前面為定義參數 相當於函數中的參數, 不用進行聲明--
as
select * from Money
go

  執行存儲過程

exec usp_getAllMoneyInfo 

  刪除存儲過程

drop proc usp_getAllMoneyInfo

  修改存儲過程

alter procedure usp_getAllMoneyInfo
as
**********
go

 

2.創建一個帶參數的存儲過程 並執行

if exists(select * from sysobjects where name='usp_getMoneyInfo')
drop proc usp_getMoneyInfo
go
--存儲過程相當於一個函數 可以有參數,輸出參數 as后為方法體 使用return進行返回--
create proc usp_getAllMoneyInfo
--as前面為定義參數 相當於函數中的參數, 不用進行聲明--
@id int
as
select * from Money where id=@id
go
exec usp_getMoneyInfo 2 --在調用后面添加參數--

3.創建一個帶output參數的存儲過程 並執行

if exists(select * from sysobjects where name='usp_getAllMoneyCount')
drop proc usp_getAllMoneyInfo
go
create proc usp_getAllMoneyCount
@count int output --外部參數在后面加output 類似於C#的out--
as
set @count = (select count(*) from Money)
go

declare @cnt int;
exec usp_getAllMoneyCount @count=@cnt output --在調用的時候 要加output的關鍵字-
print @cnt

4.創建一個帶有返回值的存儲過程 並執行

-帶有返回值的存儲過程--
--return只能返回整型的數據,如果需要返回其他類型的數據,需要使用output輸出參數--
if exists(select * from sysobjects where name='usp_getCount')
drop proc usp_getAllMoneyInfo
go
create proc usp_getCount

as
declare @count int
set @count = (select count(*) from Money)
return @count
go
declare @totalCount int
exec @totalCount = usp_getCount  --獲取返回值的格式:在exec后面添加返回值變量=--
print @totalCount

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM