Sql Server函數和存儲過程

SQL Server函數是一種封裝一條或多條SQL語句的結構。
SQL Server函數分爲系統函數和用戶自定義函數兩種。

標量值函數:標量值函數的返回值是基本數據類型的單個值或單個值得表達式。
函數體既可以是一條語句,也可以是多條語句。

創建標量值函數
語法:
CREATE FUNCTION [schema_name.]function_name([{@parameter_name parameter_data_type[=default_value]}[...n]])RETURNS return_data_type AS
BEGIN
Function_body
RETURN scalar_expression
END
語法說明:
1、[]中的內容都是可選的。
2、schema_name指定函數的架構名。
3、@parameter_name指定函數的參數名。
4、parameter_data_type指定參數的數據類型。
5、default_value指定參數的默認值。
6、RETURNS關鍵字指定函數的返回類型。
7、function_body指定函數體。
8、RETURN語句指定函數返回值或表達式。
示例如下:
USE Bank
GO
CREATE FUNCTION getAccountName
(
@account_id int ---參數

)
RETURNS varchar(20)--返回varchar(20)
AS
BEGIN
DECLARE @accountName varchar(20)
select @accountName=account_name from Account where account_id=@account_id
RETURN @accountName--返回值
END
GO
使用標量值函數
在使用標量值函數時,先傳入函數要求的參數,然後通過SELECT語句將標量值函數的返回
值賦給變量,也可以直接輸出
--直接輸出標量
select dbo.getAccountName(1) as 賬戶名稱
* 注意:在調用函數的過程中,必須在函數名前添加“dbo.”。否則,無法辨認該函數是內部函數,還是自定義函數。
--將標量值函數的返回值存入變量
DECLARE @accountName varchar(20)
select @accountName=getAccountName(1)
print '賬戶名稱爲:'+@accountName
說明:變量值函數可以被另外的標量值函數或表值函數調用。


表值函數:表值函數的返回結果爲數據表。表值函數功能強大,甚至在大多數情況下可以替代視圖。視圖無法定義參數,而表值函數卻
可以作爲帶參數的視圖使用。表值函數可以分爲多語句表值函數和內聯表值函數。
1、多語句表值函數:
多語句表值函數要求返回類型爲TABLE類型,其與標量值函數的區別是需要在函數定義的時候,在RETURNS關鍵字後面指定返回的表的結構。
語法:
CREATE FUNCTION [schema_name.]function_name ([{@parameter_name parameter_data_type [=default_value]}[,...n]])
RETURNS @table_var_name TABLE(table_definition) AS
BEGIN
Function_body
RETURN
END
多語句表值函數的定義語法與標量值函數的定義語法相比有兩點區別:一是函數聲明中的RETURNS後面
是TABLE類型且必須指定結構;二是函數體中的RETURN後面無需在寫返回的值或表達式。
示例如下:
USE Bank
GO
--函數執行完畢後返回TABLE類型的變量@deposeitTable
create function getDeposit()
returns @depositTable table
(
accountName varchar(20),
balance float
)
AS
BEGIN
--爲TABLE類型的變量賦值
insert into @depositTable
select account_name,balance from account,all_purpose_card where account.ACCOUNT_ID=all_purpost_card.ACCOUNT_ID
return --無需在寫值或表達式,直接返回變量@depositTable
END
GO
調用表值函數時,可以將其作爲普通表使用
示例如下:
--使用表值函數getDeposit
select * from getDeposit()


使用帶參數的表值函數:
USE Bank
GO
--參數要求傳入賬戶名稱
create function getDeposit(@accountName varchar(20))
returns @depositTable table
(
accountName varchar(20),
balance float
)
AS
BEGIN
--在子查詢中使用參數@accountName
insert into @depositTable
select account_name,balance from account,all_purpose_card where account.ACCOUNT_ID=all_purpost_card.ACCOUNT_ID and account_name=@accountName
return
END
GO
調用多語句表值函數:
select * from getDeposit(‘魯迅’)


內聯表值函數:
內聯表值函數是多語句表值函數的一種特殊形式,與多語句表值函數的創建方式基本相同。二者
的區別在於內聯表值函數只能有一條SELECT語句,且無須定義返回TABLE類型的變量結構,可以
在RETURN關鍵字後面直接返回SELECT語句的結果。
語法:
CREATE FUNCTION [schema_name.]function_name ([{@paramet_name parameter_data_type [=default_value]}[,...n]])
RETURNS TABLE AS
Function_body
RETURN [select_stmt]
RETURNS關鍵字後面不需要定義TABLE 類型的變量,也無需表結構的定義。在RETURN語句後面
直接使用SELECT語句查詢數據行,並返回結果。
創建一個內聯表值函數getAccount,並接受一個參數,依據傳入的參數返回賬號信息,示例如下:
USE Bank
GO
create function getAccount(@account_id int)
returns table
AS
return
(
select * from Account where account_id=@account_id
)
調用內聯表值函數:
select * from getAccount(5)


存儲過程的優點:
1、允許模塊化程序設計
2、執行速度更快
3、減少網絡流量
4、可以作爲安全機制使用
                                          常用的系統存儲過程
           
   系統存儲過程名稱                             說明
   sp_databases                                 列出服務器上所有的數據庫
   sp_hepdb                                     報告有關指定數據庫或所有數據庫的信息
   sp_renamedb                                  重命名數據庫
   sp_tables                                    返回當前環境下任何能夠在FROM子句中出現的對象
   sp_columns                                   查看某個表的列表信息
   sp_help                                      查看某個表的所有信息
   sp_helpcoonstraint                           查看某個表的約束
   sp_helpindex                                 查看某個表的索引
   sp_stored_procedure                          列出當前環境中所有的存儲過程
   sp_password                                  添加或修改登錄賬戶的密碼     
   sp_helptext                                  顯示默認值、未加密的存儲過程、用戶定義的存儲過程、觸發器或者視圖的實際文本
   sp_addrole                                   向當前數據庫中創建新的數據角色
   sp_adduser                                   向當前數據添加新的用戶
   sp_cmdshell                                  使用DOS命令操作文件和目錄
   sp_logevent                                  將用戶定義的消息記入SQL Server日誌文件盒Windows事件查看器

用戶自定義的存儲過程
語法:
CREATE PROC[EDURE] proc_name
[{@parameter_name data_type}=[默認值]] [OUTPUT,..,n]
AS
procedure_body
語法說明:PROCEDURE可以省略爲PROC,proc_name指存儲過程名稱,存儲過程名稱後面是
參數列表,爲可選項。如果有參數,則需要指定參數的數據類型;如果有默認值,則需要
指定參數的默認值。也可以爲參數指定OUTPUT關鍵字,表示參數爲傳出參數。AS關鍵字
後面的procedure_body表示存儲過程的主體是存儲過程的核心。
1、創建不帶參數的存儲過程
USE Bank
GO
if exists(select * from sysobjects where name='proc_min_balance')
drop procedure proc_min_balance
GO
create proc_min_balance
AS
select ACCOUNT_NAME from ACCOUNT where ACCOUNT_ID=
(
select top 1 ACCOUNT_ID from ALL_PURPOSE_CARD order by BALANCE

)
GO
調用存儲過程通過EXEC或EXECUTE命令執行
USE Bank
GO
exec proc_min_balance
2、帶輸入參數的存儲過程
在其他語言中,如果方法有參數,則在調用時需要傳遞實際參數值。
--創建帶參數的存儲過程,依據傳入的數據添加賬戶信息
USE Bank
GO
if exists(select * from sysobjects where name='proc_Account_Insert')
drop procedure proc_Account_Insert
GO
create proc proc_Account_Insert
@Account_Name varchar(20),
@code varchar(18),
@open_time datetime
AS
insert into ACCOUNT values(@Account_Name,@code,@open_time)
if(@@ERROR=0)
print 'ok'
else
print 'error' 
GO
執行帶參數的存儲過程,需要將實際參數值傳入存儲過程中
exec proc_Account_Insert '諸葛亮','546646265656651','2011-01-02'
   
   
帶輸出參數的存儲過程
如果需要存儲過程返回一個值或多個值,可以使用輸出參數。輸出參數必須在存儲過程定義
時使用OUTPUT關鍵字進行聲明
提示:存儲過程也可以通過RETURN返回值,但通常只會返回一些執行狀態值。
示例如下:
USE Bank
GO
if exists(select * from sysobjects where name='proc_getDay')
drop procedure proc_getDay
GO
create proc proc_getDay
@day int output,--輸出參數,返回天數
@date datetime
AS
select @day=datediff(day,@date,CETDATE())
GO
在調用帶傳出函數的存儲過程是,需要首先定義對應的變量作爲實際參數,並且必須
在實際參數後使用OUTPUT關鍵字。執行存儲過程成功後,就可以通過變量得到存儲
過程傳出的參數值。
--先定義變量,與傳出參數類型保持一致
declare @day int
--執行存儲過程時,將變量作爲實際參數,並使用OUTPUT關鍵字進行說明
exec proc_getDay @day output, '2012-01-03'
--執行完畢後,通過變量得到存儲過程傳出的值
print '距當前天數:'+cast(@day as varchar(4))
GO

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