Sql存儲過程基本語法

Sql存儲過程基本語法之簡介:

存儲過程(Stored Procedure), 是一組爲了完成特定功能的SQL 語句,集經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給出參數,如果該存儲過程帶有參數來執行它,在SQL Server 的系列版本中,存儲過程分爲兩類:系統提供的存儲過程和用戶自定義存儲過程。

系統SP,主要存儲master 數據庫中,並以sp_爲前綴並且系統存儲過程主要是從系統表中獲取信息,從而爲系統管理員管理SQL Server。 用戶自定義存儲過程是由用戶創建,並能完成某一特定功能,如:查詢用戶所需數據信息的存儲過程。存儲過程具有以下優點

1.存儲過程允許標準組件式編程(模塊化設計)

存儲過程在被創建以後,可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL語句,而且數據庫專業人員可隨時對存儲過程進行修改,但對應用程序源代碼毫無影響。因爲應用程序源代碼只包含存儲過程的調用語句,從而極大地提高了程序的可移植性。

2.存儲過程能夠實現快速的執行速度

如果某一操作包含大量的Transaction-SQL 代碼,,或分別被多次執行,那麼存儲過程要比批處理的執行速度快很多,因爲存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析優化,並給出最終被存在系統表中的執行計劃,而批處理的Transaction-SQL 語句在每次運行時都要進行編譯和優化,因此速度相對要慢一些。

3.存儲過程能夠減少網絡流量

對於同一個針對數據數據庫對象的操作,如查詢修改,如果這一操作所涉及到的Transaction-SQL 語句被組織成一存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調用語句,否則將是多條SQL 語句從而大大增加了網絡流量降低網絡負載。

4.存儲過程可被作爲一種安全機制來充分利用

系統管理員通過,對執行某一存儲過程的權限進行限制,從而能夠實現對相應的數據訪問權限的限制。

實例:create PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 頁尺寸
@PageIndex int = 1, -- 頁碼
@pagecount int output, -- 返回頁總數, 非 0 值則返回
--@OrderType bit = 0, -- 設置排序類型, 非 0 值則降序
@strWhere varchar(1500) = '1=1' -- 查詢條件 (注意: 不要加 where)
AS
declare @sql nvarchar(2000)
--獲得表中所有記錄的條數
declare @recordcount int
declare @getcountsql nvarchar(2000)
set @getcountsql = N'select @count = count(*) from ' + @tblName + N' where '
+ @strWhere
exec sp_executesql @getcountsql,N'@count int output',@count=@recordcount output
if @recordcount=0
begin
set @pagecount = 0
return
end
declare @lastcount int
set @lastcount = @recordcount % @PageSize
if @lastcount = 0
set @pagecount = @recordcount / @PageSize
else
set @pagecount = @recordcount / @PageSize + 1
if @lastcount = 0 or @pageindex < @pagecount
begin
set @sql = N'select ' + @strGetFields + N' from (select top ' + convert(nvarchar(4),@PageSize) +
N' * from (select top ' + convert(varchar(10),@PageSize*@PageIndex) + N' * from ' +
@tblName + N' where ' + @strWhere + N' order by ' +@fldName+ N') as t order by ' + @fldName +
' desc) as tt order by ' + @fldName
end
else
begin
if @lastcount != 0 and @pageindex = @pagecount
begin
set @sql = N'select ' + @strGetFields + N' from (select top ' + convert(nvarchar(4),@lastcount) +
N' * from (select top ' + convert(varchar(10),@PageSize*@PageIndex) + N' * from ' +
@tblName + N' where ' + @strWhere + N' order by ' +@fldName+ N') as t order by ' + @fldName + ' desc) as tt order by ' + @fldName
end
end
print @sql
exec sp_executesql @sql
go
select * from authors
declare @pagecount int
exec pagination 'authors','*','au_id',5,1, @pagecount output,'state=''CA'''
print @pagecount



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章