帶參數的存儲過程


創建帶參數的sql存儲過程:創建帶參數的存儲過程首先要在存儲過程中聲明該參數,每個存儲過程參數都必須用惟一的名稱進行定義。與標准的Transact-SQL變量相同,參數名必須以@為前綴,
創建帶參數的存儲過程
創建帶參數的存儲過程首先要在存儲過程中聲明該參數,每個存儲過程參數都必須用惟一的名稱進行定義。與標准的Transact-SQL變量相同,參數名必須以@為前綴,並且遵從對象標識符規則。當用戶不提供該參數的值時可以使用一個默認值來代替。
在執行帶參數的存儲過程時,既可以通過顯式指定參數名稱並賦予適當的值,也可以通過提供在CREATE PROCEDURE語句中給定的參數值(不指定參數名稱)來向存儲過程傳遞值。
在存儲過程PRO_Student_IN中命名4個參數,其定義順序為@Chinese、@English、@maths和@class。
例如,將值傳遞給存儲過程指定的參數名稱。
EXEC PRO_Student_IN @class="三年一班",@Chinese=85,@maths=85,@English=85
例如,按照參數的位置傳遞,而不命名參數名稱。
EXEC PRO_Student_IN 85,85,85,"三年一班"
1.不帶默認值的參數
創建一個參數不帶默認值的存儲過程,在調用該存儲過程時,必須對存儲過程中的所有參數進行賦值,如果有一個參數沒有賦值,則無法調用該存儲過程。
下面創建一個不帶參數默認值的存儲過程,並通過指定參數的賦值,查詢“MR_Student”表中指定班級的學生信息。運行結果如圖1所示。

圖1 創建帶參數的存儲過程
操作步驟如下:
(1)在操作系統的任務欄中單擊“開始”菜單,選擇“程序”→“Microsoft SQL Server”→“查詢分析器”命令,打開查詢分析器。
(2)SQL語句如下:
USE MR_SQ --打開創建存儲過程的數據庫
GO
--創建存儲過程
CREATE PROCEDURE PRO_Student_IN
@Chinese int, --定義參數
@English int,
@maths int,
@class varchar(20)
AS
Select *
from MR_Student
where 語文>@Chinese and 英語>@English and 數學>@maths and 班級=@class
GO
執行PRO_Student_IN存儲過程有兩種方法。
(1)按存儲過程中參數的順序對參數進行賦值。
EXEC PRO_Student_IN 65,77,70,"三年一班"
(2)執行存儲過程時,可以按任意順序對參數進行賦值。
EXEC PRO_Student_IN @class="三年一班",@Chinese=65,@maths=70,@English=77
2.帶默認值的參數
在執行存儲過程PRO_Student_IN時,如果缺省任何一個參數,將會產生錯誤,解決這種問題的方法是建立使用默認值的參數。只要在參數的定義之后加上等號,並在等號后面寫出默認值。
例如,給參數設置默認值。
@Str varchar(20)='長春',
@Int Int=10,
@Char char(8)='0001',
@float float=12.3
本示例利用存儲過程中的默認參數對數據表“MR_Student”進行查詢。運行結果如圖2所示。

 



圖2 創建帶參數默認值的存儲過程
操作步驟如下:
(1)在操作系統的任務欄中單擊“開始”菜單,選擇“程序”→“Microsoft SQL Server”→“查詢分析器”命令,打開查詢分析器。
(2)SQL語句如下:
--創建存儲過程
USE MR_SQL
GO
CREATE PROCEDURE PRO_Student_NULL
@Chinese int=60, --對參數設置默值
@English int=60,
@maths int=60,
@class varchar(20)='三年二班'(責任編輯:admin)

AS
Select *
from MR_Student
where 語文>@Chinese and 英語>@English and 數學>@maths and 班級=@class
GO
執行存儲過程,查詢三年二班成績全部及格並且數學成績大於80的學生信息。
EXEC PRO_Student_NULL @maths=80
也可以用以下SQL語句調用PRO_Student_NULL存儲過程:
例如,查詢三年二班成績全部及格並且語文成績大於70的學生信息。
EXEC PRO_Student_NULL 70
例如,查詢三年二班成績全部及格的學生信息。
EXEC PRO_Student_NULL
3.帶返回參數的存儲過程
在創建存儲過程時,可以用OUTPOT參數來創建一個帶返回值的存儲過程,例如:
@int int OUTPUT
@char char(10) OUTPUT
@float float OUTPUT
其中text、image等大於二進制數據類型的參數不能作為OUTPUT參數,在調用存儲過程時,不必為返回參數賦值。
本示例利用存儲過程中的OUTPUT參數,在調用存儲過程后利用返回值來判斷查詢的結果。運行結果如圖3所示。

圖3 創建帶返回參數的存儲過程
操作步驟如下:
(1)在操作系統的任務欄中單擊“開始”菜單,選擇“程序”→“Microsoft SQL Server”→“查詢分析器”命令,打開查詢分析器。
(2)SQL語句如下:
--創建帶返回值的存儲過程
CREATE PROCEDURE PRO_OUP
@class char(10),
@ave int OUTPUT --設置帶返回值的參數
AS
select @ave =avg(數學) from MR_Student where 班級=@class
GO
--執行存儲過程
DECLARE @average int --自定義變量
DECLARE @subject char(10)
SET @subject='三年一班' --對變量進行賦值
EXEC PRO_OUP @subject,@average output --調用存儲過程
if @average>=85 --利用存儲過程的返回值進行判斷
PRINT rtrim(@subject)+'數學的平均成績為高等水平'
if @average>=70
PRINT rtrim(@subject)+'數學的平均成績為中等水平'
if @average<70
PRINT rtrim(@subject)+'數學的平均成績為一般水平'
運行結果:
三年一班數學的平均成績為79,屬於中等水平

(責任編輯:admin)

 

 

摘要 存儲過程的調用在B/S系統中用的很多。傳統的調用方法不僅速度慢,而且代碼會隨着存儲過程的增多不斷膨脹,難以維護。新的方法在一定程度上解決了這些問題。

  關鍵詞 ASP.NET;存儲過程
 
  在使用.NET的過程中,數據庫訪問是一個很重要的部分,特別是在B/S系統的構建過程中,數據庫操作幾乎成為了一個必不



可少的操作。調用存儲過程實現數據庫操作使很多程序員使用的方法,而且大多數的程序員都是能使用存儲過程就使用存儲過程,很少直接使用SQL語句,所以存儲過程是很有用而且很重要的。

  存儲過程簡介

  簡單的說,存儲過程是由一些SQL語句和控制語句組成的被封裝起來的過程,它駐留在數據庫中,可以被客戶應用程序調用,也可以從另一個過程或觸發器調用。它的參數可以被傳遞和返回。與應用程序中的函數過程類似,存儲過程可以通過名字來調用,而且它們同樣有輸入參數和輸出參數。

  根據返回值類型的不同,我們可以將存儲過程分為三類:返回記錄集的存儲過程, 返回數值的存儲過程(也可以稱為標量存儲過程),以及行為存儲過程。顧名思義,返回記錄集的存儲過程的執行結果是一個記錄集,典型的例子是從數據庫中檢索出符合某一個或幾個條件的記錄;返回數值的存儲過程執行完以后返回一個值,例如在數據庫中執行一個有返回值的函數或命令;最后,行為存儲過程僅僅是用來實現數據庫的某個功能,而沒有返回值,例如在數據庫中的更新和刪除操作。

  使用存儲過程的好處

  相對於直接使用SQL語句,在應用程序中直接調用存儲過程有以下好處:

  (1)減少網絡通信量。調用一個行數不多的存儲過程與直接調用SQL語句的網絡通信量可能不會有很大的差別,可是如果存儲過程包含上百行SQL語句,那么其性能絕對比一條一條的調用SQL語句要高得多。

  (2)執行速度更快。有兩個原因:首先,在存儲過程創建的時候,數據庫已經對其進行了一次解析和優化。其次,存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行同樣的存儲過程時,可以從內存中直接調用。

  (3)更強的適應性:由於存儲過程對數據庫的訪問是通過存儲過程來進行的,因此數據庫開發人員可以在不改動存儲過程接口的情況下對數據庫進行任何改動,而這些改動不會對應用程序造成影響。

  (4) 布式工作:應用程序和數據庫的編碼工作可以分別獨立進行,而不會相互壓制。

  由以上的分析可以看到,在應用程序中使用存儲過程是很有必要的。

  兩種不同的存儲過程調用方法

  為了突出新方法的優點,首先介紹一下在.NET中調用存儲過程的“官方”方法。另外,本文的所有示例程序均工作於SqlServer數據庫上,其它情況類似,以后不再一一說明。本文所有例子均采用C#語言。

  要在應用程序中訪問數據庫,一般性的步驟是:首先聲明一個數據庫連接SqlConnection,然后聲明一個



數據庫命令SqlCommand,用來執行SQL語句和存儲過程。有了這兩個對象后,就可以根據自己的需要采用不同的執行方式達到目的。需要補充的是,不要忘記在頁面上添加如下的引用語句:using System.Data.SqlClient。

  就執行存儲過程來說,如果執行的是第一類存儲過程,那么就要用一個DataAdapter將結果填充到一個DataSet中,然后就可以使用數據網格控件將結果呈現在頁面上了;如果執行的是第二和第三種存儲過程,則不需要此過程,只需要根據特定的返回判定操作是否成功完成即可。

  (1)執行一個沒有參數的存儲過程的代碼如下:


SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;

  然后只要選擇適當的方式執行此處過程,用於不同的目的即可。

  (2)執行一個有參數的存儲過程的代碼如下(我們可以將調用存儲過程的函數聲明為ExeProcedure(string inputdate)):


SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;
(以上代碼相同,以下為要添加的代碼)
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

  這樣就添加了一個輸入參數。若需要添加輸出參數:


param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

  若要獲得參儲過程的返回值:


param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);

  從上面的代碼我們可以看出,當存儲過程比較多或者存儲過程的參數比較多時,這種方法會大大影響開發的速度;另外一方面,如果項目比較大,那么這些用於數據庫邏輯的函數在以后的維護中也是一個很大的負擔。那么,有沒有一種改進的方法可以解決這個問題呢?想到在執行沒有參數的存儲過程時只需要傳入一個存儲過程的名字就可以調用相應的存儲過程,而且在SqlServer數據庫中我們可以直接在查詢分析器中敲入“存儲過程名(參數列表)”樣的字符串就可以執行存儲過程,那么,是



否可以把這種思想應用到應用程序中呢?

  於是在編譯器中鍵入相應代碼。這些代碼是在調用不帶參數的存儲過程的代碼的基礎上改的。具體代碼如下:


SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure(’para1’,’para2’,para3)";
da.SelectCommand.CommandType = CommandType.StoredProcedure;

  為了使代碼更具有代表性,要調用的存儲過程的第一個和第二個參數都為字符串類型,第三個參數為整型。執行以后發現,完全可以達到預期的效果!


SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=sa;database=yourdatabase")
SqlCommand cmd=new SqlCommand("libsearch",conn);
cmd.CommandType = CommandType.StoredProcedure;//指示libsearch為存儲過程
cmd.Parameters.Add("@name",SqlDbType.Char,20);
cmd.Parameters["@name"].Value=傳入name的值
cmd.Parameters.Add("@member_no",SqlDbType.Int,4);
cmd.Parameters["@member_no"].Value=傳入member_no的值
cmd.Parameters.Add("@loancount",SqlDbType.Int,4);
cmd.Parameters["@loancount"].Direction=ParameterDirection.Output;

cmd.ExcuteNonQuery();//執行存儲過程
string loancount=cmd.Parameters["@loancount"].Value.ToString()
//得到值.

 


免責聲明!

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



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