SQL Server數據庫基礎知識——數據庫存儲過程怎麼寫

SQL Server數據庫基礎知識

存儲過程概述

1. 什麼是存儲過程?

存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需創建一次,以後在程序中就可以調用多次。如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。可以用一個“execute 存儲過程名 參數”命令來調用存儲過程。

2. 存儲過程的種類

1 系統存儲過程

以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作。

2 自定義存儲過程(本地存儲過程)

以cp_開頭,是用戶爲了完成某一特定功能而創建的存儲過程,一般所說的存儲過程就是指本地存儲過程。

3 臨時存儲過程

分爲兩種存儲過程:

一是本地臨時存儲過程,以井字號(#)作爲其名稱的第一個字符,則該存儲過程將成爲一個存放在tempdb數據庫中的本地臨時存儲過程,且只有創建它的用戶才能執行它;

二是全局臨時存儲過程,以兩個井字號(##)號開始,則該存儲過程將成爲一個存儲在tempdb數據庫中的全局臨時存儲過程,全局臨時存儲過程一旦創建,以後連接到服務器的任意用戶都可以執行它,而且不需要特定的權限。

4 遠程存儲過程

在SQL Server2005中,遠程存儲過程(Remote Stored Procedures)是位於遠程服務器上的存儲過程,通常可以使用分佈式查詢和EXECUTE命令執行一個遠程存儲過程。

5 擴展存儲過程

擴展存儲過程(Extended Stored Procedures)是用戶可以使用外部程序語言編寫的存儲過程,而且擴展存儲過程的名稱通常以xp_開頭。

3. 如何創建、修改、刪除、調用存儲過程?

–創建存儲過程
create proc 存儲過程名字
as
語句

–修改存儲過程
alter proc 存儲過程名字
as
語句

–卸載存儲過程
drop proc 存儲過程名字

–調用存儲過程
exec 存儲過程名稱

4. 存儲過程的優缺點

優點:

1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。

2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此複雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。

3.存儲過程可以重複使用,可減少數據庫開發人員的工作量(複用性高,面向對象的編程思想)

4.安全性高,可設定只有某些用戶才具有對指定存儲過程的使用權

缺點:

​ 1:調試麻煩,但是用 PL/SQL Developer 調試很方便!彌補這個缺點。

​ 2:移植問題,數據庫端代碼當然是與數據庫相關的。但是如果是做工程型項目,基本不存在移植問題。

​ 3:重新編譯問題,因爲後端代碼是運行前編譯的,如果帶有引用關係的對象發生改變時,受影響的存儲過 程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯)。

​ 4: 如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨着用戶需求的增加會導致數據結構的變 化,接着就是系統的相關問題了,最後如果用戶想維護該系統可以說是很難很難、而且代價是空前的,維護起來更麻煩。

5. 存儲過程和觸發器的區別?

觸發器與存儲過程的主要區別在於觸發器的運行方式。存儲過程必須有用戶、應用程序或者觸發器來顯示的調用並執行,而觸發器是當特定時間出現的時候,自動執行或者激活的,與連接用數據庫中的用戶、或者應用程序無關。

6. 存儲過程和函數的區別?

存儲過程是用戶定義的一系列SQL語句的集合,而函數通常是數據庫已定義的方法,具體區別如下:

1.對於存儲過程來說可以返回參數,而函數只能返回值或者表對象.

2.函數必須有返回值,存儲過程可有可無

3.存儲過程一般是作爲一個獨立的部分來執行,而函數可以作爲查詢語句的一部分來調用

7. 存儲過程的使用

接下來以兩張表來向大家演示存儲過程的使用。

書籍分類表(BookTypes)和書籍表(books)結構設計

img

img

書籍分類表(BookTypes)
ID Name(分類名稱) Nums(數量)
1 科技類 10
2 文學類 10
3 軍事類 10
書籍表(books)
ID Name(書籍名稱) Remark(備註) TypeID(分類ID)
1 數據庫 NULL 1
2 西遊記 NULL 2
3 百團大戰 NULL 3
4 數據庫 NULL 1
5 數據庫 NULL 1
6 數據庫 NULL 1
7 數據庫 NULL 1
1:不帶參數的存儲過程
--創建存儲過程查詢數據
create proc cp_select_book_bybook --創建一個叫cp_select_book_bybook的存儲過程
as --要執行的操作
  select * from books --從books表中查詢數據
--調用存儲過程
exec cp_select_book_bybook
2:帶輸入參數的存儲過程
--根據名稱參數查詢數據
create proc cp_select_book_ByName
(
@name varchar(50)
)
as
  select*from books where name like '%'+@name+'%'
--調用
exec cp_select_book_ByName'數據庫'
3:帶輸出參數的存儲過程
--根據名稱查詢,返回記錄,同時返回記錄數
go
create proc cp_select_book_ByNameExt
(
@name varchar(50),
@recordRows int out  --out表示輸出類型
)
as
  select*from books where name like '%'+@name+'%'
  select @recordRows=count(*) from books

--調用
  --定義一個變量,接收返回參數@recordRows的值
  declare @rs int --定義一個變量接收@recordRows的數據
  exec cp_select_book_ByNameExt'數據庫',@rs out
  print '查詢到的記錄數是:'+convert(varchar(50),@rs)

4:簡單的分頁的存儲過程的創建和調用
--根據名稱,頁碼,每頁顯示的條數  --輸入參數
--返回查詢條件的總記錄數  --輸出參數
--顯示查詢結果

go
create proc cp_page
(
@name varchar(50),
@pageIndex int,  --頁碼
@pageSize int,  --每頁顯示條數
@rs int out  --總記錄數,out表示輸出類型
)
as
  select top (@pageSize)*from books
  where id not in(
  select top (@pageSize*(@pageIndex-1)) id from books where name like '%'+@name+'%'
  order by id
  )
  and name like '%'+@name+'%' order by id
 
  select @rs= count(*) from books where name like '%'+@name+'%'

  --調用
  --定義一個變量,接收返回參數@totalcount的值
  declare @rows int --定義一個變量接收@totalcount的數據
  exec cp_page'數據庫',1,5,@rows out
  print '查詢到的總記錄數是:'+convert(varchar(50),@rows)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章