




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、存儲(chǔ)過程詳解存儲(chǔ)過程簡介什么是存儲(chǔ)過程:存儲(chǔ)過程可以說是一個(gè)記錄集吧,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個(gè)方法一樣實(shí)現(xiàn)一些功能(對(duì)單表或多表的增刪改查),然后再給這個(gè)代碼塊取一個(gè)名字,在用到這個(gè)功能的時(shí)候調(diào)用他就行了。存儲(chǔ)過程的好處:1.由于數(shù)據(jù)庫執(zhí)行動(dòng)作時(shí),是先編譯后執(zhí)行的。然而存儲(chǔ)過程是一個(gè)編譯過的代碼塊,所以執(zhí)行效率要比T-SQL語句高。2.一個(gè)存儲(chǔ)過程在程序在網(wǎng)絡(luò)中交互時(shí)可以替代大堆的T-SQL語句,所以也能降低網(wǎng)絡(luò)的通信量,提高通信速率。3.通過存儲(chǔ)過程能夠使沒有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫,從而確保數(shù)據(jù)的安全。小結(jié):總之存儲(chǔ)過程是好東西,在做項(xiàng)
2、目時(shí)屬于必備利器,下面介紹存儲(chǔ)過程的基本語法。存儲(chǔ)過程的語法和參數(shù)講解存儲(chǔ)過程的一些基本語法:-創(chuàng)建存儲(chǔ)過程-CREATE PROC EDURE procedure_name ; number parameter data_type VARYING = default OUTPUT ,.n WITH RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION FOR REPLICATION AS sql_statement .n -調(diào)用存儲(chǔ)過程-EXECUTE Procedure_name '' -存儲(chǔ)過程如果有參數(shù),后面加參數(shù)格式為:參數(shù)名
3、=value,也可直接為參數(shù)值value-刪除存儲(chǔ)過程-drop procedure procedure_name -在存儲(chǔ)過程中能調(diào)用另外一個(gè)存儲(chǔ)過程,而不能刪除另外一個(gè)存儲(chǔ)過程創(chuàng)建存儲(chǔ)過程的參數(shù):1.procedure_name :存儲(chǔ)過程的名稱,在前面加#為局部臨時(shí)存儲(chǔ)過程,加#為全局臨時(shí)存儲(chǔ)過程。2.; number:是可選的整數(shù),用來對(duì)同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應(yīng)用程序使用的過程可以命名為 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 語句
4、將除去整個(gè)組。如果名稱中包含定界標(biāo)識(shí)符,則數(shù)字不應(yīng)包含在標(biāo)識(shí)符中,只應(yīng)在 procedure_name 前后使用適當(dāng)?shù)亩ń绶?3.parameter: 存儲(chǔ)過程的參數(shù)??梢杂幸粋€(gè)或多個(gè)。用戶必須在執(zhí)行過程時(shí)提供每個(gè)所聲明參數(shù)的值(除非定義了該參數(shù)的默認(rèn)值)。存儲(chǔ)過程最多可以有 2.100 個(gè)參數(shù)。 使用 符號(hào)作為第一個(gè)字符來指定參數(shù)名稱。參數(shù)名稱必須符合標(biāo)識(shí)符的規(guī)則。每個(gè)過程的參數(shù)僅用于該過程本身;相同的參數(shù)名稱可以用在其它過程中。默認(rèn)情況下,參數(shù)只能代替常量,而不能用于代替表名、列名或其它數(shù)據(jù)庫對(duì)象的名稱。有關(guān)更多信息,請(qǐng)參見 EXECUTE。 4.data_type:參數(shù)的數(shù)據(jù)類型。所有
5、數(shù)據(jù)類型(包括 text、ntext 和 image)均可以用作存儲(chǔ)過程的參數(shù)。不過,cursor 數(shù)據(jù)類型只能用于 OUTPUT 參數(shù)。如果指定的數(shù)據(jù)類型為 cursor,也必須同時(shí)指定 VARYING 和 OUTPUT 關(guān)鍵字。有關(guān) SQL Server 提供的數(shù)據(jù)類型及其語法的更多信息,請(qǐng)參見數(shù)據(jù)類型。 說明 對(duì)于可以是 cursor 數(shù)據(jù)類型的輸出參數(shù),沒有最大數(shù)目的限制。 5.VARYING: 指定作為輸出參數(shù)支持的結(jié)果集(由存儲(chǔ)過程動(dòng)態(tài)構(gòu)造,內(nèi)容可以變化)。僅適用于游標(biāo)參數(shù)。6.default: 參數(shù)的默認(rèn)值。如果定義了默認(rèn)值,不必指定該參數(shù)的值即可執(zhí)行過程。默認(rèn)值必須是常量或 N
6、ULL。如果過程將對(duì)該參數(shù)使用 LIKE 關(guān)鍵字,那么默認(rèn)值中可以包含通配符(%、_、 和 )。7.OUTPUT :表明參數(shù)是返回參數(shù)。該選項(xiàng)的值可以返回給 EXECUTE。使用 OUTPUT 參數(shù)可將信息返回給調(diào)用過程。Text、ntext 和 image 參數(shù)可用作 OUTPUT 參數(shù)。使用 OUTPUT 關(guān)鍵字的輸出參數(shù)可以是游標(biāo)占位符。8.RECOMPILE: 表明 SQL Server 不會(huì)緩存該過程的計(jì)劃,該過程將在運(yùn)行時(shí)重新編譯。在使用非典型值或臨時(shí)值而不希望覆蓋緩存在內(nèi)存中的執(zhí)行計(jì)劃時(shí),請(qǐng)使用 RECOMPILE 選項(xiàng)。9.ENCRYPTION: 表示 SQ
7、L Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復(fù)制的一部分發(fā)布。 說明 在升級(jí)過程中,SQL Server 利用存儲(chǔ)在 syscomments 中的加密注釋來重新創(chuàng)建加密過程。10.FOR REPLICATION :指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲(chǔ)過程。.使用 FOR REPLICATION 選項(xiàng)創(chuàng)建的存儲(chǔ)過程可用作存儲(chǔ)過程篩選,且只能在復(fù)制過程中執(zhí)行。本選項(xiàng)不能和 WITH RECOMPILE 選項(xiàng)一起使用。11.AS :指定過程要執(zhí)行的操作。12.sq
8、l_statement :過程中要包含的任意數(shù)目和類型的 Transact-SQL 語句。但有一些限制。小結(jié):看過這些基本語法后,下面我就根據(jù)語法創(chuàng)建各式的存儲(chǔ)過程。創(chuàng)建存儲(chǔ)過程UserAccountUserIDUserNamePassWordRegisterTimeRegisterIP12662012-12-31618552013-01-01519112013-01-01120222013-01-01221332013-01-01322442013-01-01423552013-01-01525772013-01-01726882013-01-018NULLNULLNULLNULLNULL針
9、對(duì)上面的表,我使用存儲(chǔ)過程對(duì)它做一些操作:1. 只返回單一記錄集的存儲(chǔ)過程-創(chuàng)建名為GetUserAccount的存儲(chǔ)過程-create Procedure GetUserAccountasselect * from UserAccountgo-執(zhí)行上面的存儲(chǔ)過程-exec GetUserAccount結(jié)果:相當(dāng)于運(yùn)行 select * from UserAccount 這行代碼,結(jié)果為整個(gè)表的數(shù)據(jù)。2.沒有輸入輸出的存儲(chǔ)過程-創(chuàng)建名為GetUserAccount的存儲(chǔ)過程-create Procedure inUserAccountasinsert into UserAccount
10、 (UserName,PassWord,RegisterTime,RegisterIP) values(9,9,'2013-01-02',9)go-執(zhí)行上面的存儲(chǔ)過程-exec inUserAccount結(jié)果:相當(dāng)于運(yùn)行 insert into UserAccount (UserName,PassWord,RegisterTime,RegisterIP) values(9,9,'2013-01-02',9) 這行代碼。3.有返回值的存儲(chǔ)過程-創(chuàng)建名為GetUserAccount的存儲(chǔ)過程-create Procedure inUserAccountRe
11、asinsert into UserAccount (UserName,PassWord,RegisterTime,RegisterIP) values(10,10,'2013-01-02',10)return rowcountgo-執(zhí)行上面的存儲(chǔ)過程-exec inUserAccountRe解釋:這里的rowcount為執(zhí)行存儲(chǔ)過程影響的行數(shù),執(zhí)行的結(jié)果是不僅插入了一條數(shù)據(jù),還返回了一個(gè)值即 return value =1 ,這個(gè)可以在程序中獲取,稍后在c#調(diào)用存儲(chǔ)過程中會(huì)有說到。4.有輸入?yún)?shù)和輸出參數(shù)的存儲(chǔ)過程-創(chuàng)建名為GetUserAccount的存儲(chǔ)過程-
12、create Procedure GetUserAccountReUserName nchar(20),UserID int outputasif(UserName>5)select UserID=COUNT(*) from UserAccount where UserID>25elseset UserID=1000go-執(zhí)行上面的存儲(chǔ)過程-exec GetUserAccountRe '7',null解釋:UserName為輸入?yún)?shù),UserID為輸出參數(shù)。 運(yùn)行結(jié)果為userID為COOUT(*)即 =1。5. 同時(shí)具有返回值、輸入?yún)?shù)、輸出參數(shù)的存儲(chǔ)過程-創(chuàng)建名
13、為GetUserAccount的存儲(chǔ)過程-create Procedure GetUserAccountRe1UserName nchar(20),UserID int outputasif(UserName>5)select UserID=COUNT(*) from UserAccount where UserID>25elseset UserID=1000return rowcountgo-執(zhí)行上面的存儲(chǔ)過程-exec GetUserAccountRe1 '7',null結(jié)果:userID為COOUT(*)即 =1,Retun Value=1。6.同時(shí)返回參數(shù)和
14、記錄集的存儲(chǔ)過程-創(chuàng)建名為GetUserAccount的存儲(chǔ)過程-create Procedure GetUserAccountRe2UserName nchar(20),UserID int outputasif(UserName>5)select UserID=COUNT(*) from UserAccount where UserID>25elseset UserID=1000select * from UserAccountreturn rowcountgo-執(zhí)行上面的存儲(chǔ)過程-exec GetUserAccountRe2 '7',null結(jié)果:返回執(zhí)行 s
15、elect * from UserAccount 這句代碼的結(jié)果集,同時(shí)userID為COOUT(*)即 =1,Retun Value=9。7.返回多個(gè)記錄集的存儲(chǔ)過程-創(chuàng)建名為GetUserAccount的存儲(chǔ)過程-create Procedure GetUserAccountRe3asselect * from UserAccountselect * from UserAccount where UserID>5go-執(zhí)行上面的存儲(chǔ)過程-exec GetUserAccountRe3結(jié)果:返回兩個(gè)結(jié)果集,一個(gè)為 select * from UserAccount,另一個(gè)為 s
16、elect * from UserAccount where UserID>5 。小結(jié):上面我們創(chuàng)建了各式的存儲(chǔ)過程,下面看我們?cè)赾#中怎樣調(diào)用這些存儲(chǔ)過程。c#調(diào)用存儲(chǔ)過程這里調(diào)用的存儲(chǔ)過程為上面我寫的那些各式各樣的存儲(chǔ)過程。View Codepublic partial class ProcedureTest : System.Web.UI.Pagepublic static string conn = ConfigurationManager.ConnectionStrings"StuRelationDBConnectionString".ConnectionS
17、tring;public SqlConnection con = new SqlConnection(conn);protected void Page_Load(object sender, EventArgs e)runGetUserAccountRe3();/只返回單一記錄集的存儲(chǔ)過程GetUserAccountpublic void runGetUserAccount()SqlDataAdapter dp = new SqlDataAdapter(common("GetUserAccount");DataSet ds = new DataSet();/ 填充data
18、set dp.Fill(ds);rpt.DataSource = ds;rpt.DataBind();/沒有輸入輸出的存儲(chǔ)過程inUserAccountpublic void runinUserAccount()con.Open();Label1.Text = common("inUserAccount").ExecuteNonQuery().ToString();con.Close();/有返回值的存儲(chǔ)過程inUserAccountRepublic void runinUserAccountRe()/ 創(chuàng)建參數(shù)SqlCommand cmd = common("i
19、nUserAccountRe");IDataParameter parameters = new SqlParameter("rval", SqlDbType.Int,4);/ 將參數(shù)類型設(shè)置為 返回值類型parameters0.Direction = ParameterDirection.ReturnValue;/ 添加參數(shù)cmd.Parameters.Add(parameters0);con.Open();/ 執(zhí)行存儲(chǔ)過程并返回影響的行數(shù)Label1.Text = cmd.ExecuteNonQuery().ToString();con.Close();/ 顯
20、示影響的行數(shù)和返回值Label1.Text += "-" + parameters0.Value.ToString();/有輸入?yún)?shù)和輸出參數(shù)的存儲(chǔ)過程public void runGetUserAccountRe()SqlCommand cmd = common("GetUserAccountRe");/ 創(chuàng)建參數(shù)IDataParameter parameters = new SqlParameter("UserName", SqlDbType.NChar,20) ,new SqlParameter("UserID&quo
21、t;, SqlDbType.Int) ,;/ 設(shè)置參數(shù)類型parameters0.Value = "7"parameters1.Direction = ParameterDirection.Output; / 設(shè)置為輸出參數(shù)/ 添加參數(shù)cmd.Parameters.Add(parameters0);cmd.Parameters.Add(parameters1);con.Open();/ 執(zhí)行存儲(chǔ)過程并返回影響的行數(shù)Label1.Text = cmd.ExecuteNonQuery().ToString();con.Close();/ 顯示影響的行數(shù)和輸出參數(shù)Label1.T
22、ext += "-" + parameters1.Value.ToString();/同時(shí)具有返回值、輸入?yún)?shù)、輸出參數(shù)的存儲(chǔ)過程GetUserAccountRe1public void runGetUserAccountRe1()SqlCommand cmd = common("GetUserAccountRe1");/ 創(chuàng)建參數(shù)IDataParameter parameters = new SqlParameter("UserName", SqlDbType.NChar,20) ,new SqlParameter("Us
23、erID", SqlDbType.Int) ,new SqlParameter("rval", SqlDbType.Int,4);/ 設(shè)置參數(shù)類型parameters0.Value = "7"parameters1.Direction = ParameterDirection.Output; / 設(shè)置為輸出參數(shù)parameters2.Direction = ParameterDirection.ReturnValue; /設(shè)置為返回值/ 添加參數(shù)cmd.Parameters.Add(parameters0);cmd.Parameters.Add
24、(parameters1);cmd.Parameters.Add(parameters2);con.Open();/ 執(zhí)行存儲(chǔ)過程并返回影響的行數(shù)Label1.Text = cmd.ExecuteNonQuery().ToString();con.Close();/ 顯示影響的行數(shù)和輸出參數(shù)Label1.Text += "-輸出參數(shù)為:" + parameters1.Value.ToString();Label1.Text += "-返回值為:" + parameters2.Value.ToString();/同時(shí)返回參數(shù)和記錄集的存儲(chǔ)過程GetUser
25、AccountRe2public void runGetUserAccountRe2()SqlCommand cmd = common("GetUserAccountRe2");/ 創(chuàng)建參數(shù)IDataParameter parameters = new SqlParameter("UserName", SqlDbType.NChar,20) ,new SqlParameter("UserID", SqlDbType.Int) ,new SqlParameter("rval", SqlDbType.Int,4);/
26、設(shè)置參數(shù)類型parameters0.Value = "7"parameters1.Direction = ParameterDirection.Output; / 設(shè)置為輸出參數(shù)parameters2.Direction = ParameterDirection.ReturnValue; /設(shè)置為返回值/ 添加參數(shù)cmd.Parameters.Add(parameters0);cmd.Parameters.Add(parameters1);cmd.Parameters.Add(parameters2);con.Open();/ 執(zhí)行存儲(chǔ)過程并返回影響的行數(shù)Label1.Te
27、xt = cmd.ExecuteNonQuery().ToString();DataSet ds = new DataSet();SqlDataAdapter dt = new SqlDataAdapter(cmd);dt.Fill(ds);rpt.DataSource = ds;rpt.DataBind();con.Close();/ 顯示影響的行數(shù)和輸出參數(shù)Label1.Text += "-輸出參數(shù)為:" + parameters1.Value.ToString();Label1.Text += "-返回值為:" + parameters2.Valu
28、e.ToString();/返回多個(gè)記錄集的存儲(chǔ)過程public void runGetUserAccountRe3()DataSet ds = new DataSet();SqlDataAdapter dt = new SqlDataAdapter(common("GetUserAccountRe3");dt.Fill(ds);rpt1.DataSource = ds.Tables0.DefaultView;rpt1.DataBind();rpt2.DataSource = ds.Tables1.DefaultView;rpt2.DataBind();public Sql
29、Command common(string proName)SqlCommand cmd = new SqlCommand();/ 設(shè)置sql連接cmd.Connection = con;/ 如果執(zhí)行語句cmd.CommandText = proName;/ 指定執(zhí)行語句為存儲(chǔ)過程cmd.CommandType = CommandType.StoredProcedure;return cmd;附帶SQLServer數(shù)據(jù)庫的一些全局變量View Codeselect APP_NAME ( ) as w -當(dāng)前會(huì)話的應(yīng)用程序select IDENTITY -返回最后插入的標(biāo)識(shí)值 select USER_NAME() -返回用戶數(shù)據(jù)庫用戶名SELECT CONNECTIONS -返回自上次SQL啟動(dòng)以來連接或試圖連接的次數(shù)。 SELECT GETDATE() -當(dāng)前時(shí)間 SELECT CPU_BUSY/100 -返回自上次啟動(dòng)SQL 以來 CPU 的工作時(shí)間,單位為毫秒U(xiǎn)SE tempdb SELECT DBTS as w -為當(dāng)前數(shù)據(jù)庫返回當(dāng)前 timestamp 數(shù)據(jù)類型的值。這一 timesta
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)村合作社與農(nóng)戶聯(lián)合開發(fā)農(nóng)業(yè)技術(shù)項(xiàng)目協(xié)議
- 通信技術(shù)與信號(hào)處理練習(xí)題
- 技術(shù)標(biāo)準(zhǔn)制定合作協(xié)議
- 數(shù)學(xué)課本九章算術(shù)教案
- 教育資源分布報(bào)告表
- 西廂記的愛情悲劇征文
- 中學(xué)生國學(xué)經(jīng)典故事解讀
- 農(nóng)業(yè)旅游開發(fā)實(shí)施方案
- 數(shù)據(jù)安全與隱私保護(hù)服務(wù)協(xié)議約定事項(xiàng)
- 業(yè)務(wù)往來預(yù)付款協(xié)議書
- 體育測(cè)量與評(píng)價(jià)-第二章-體育測(cè)量與評(píng)價(jià)的基礎(chǔ)理論課件
- 法律服務(wù)方案(投標(biāo))
- 轉(zhuǎn)移的危險(xiǎn)廢物性狀清單
- 高中英語-新外研版必修一unit5-The-Monarchs-Journey-公開課reading課件
- 建設(shè)項(xiàng)目用地預(yù)審與選址意見課件講解
- 四年級(jí)公共安全教育全冊(cè)教案(海峽教育出版社)
- 工程結(jié)構(gòu)通用規(guī)范
- 《構(gòu)成基礎(chǔ)》PPT課件(190頁P(yáng)PT)
- 四年級(jí)道德與法治從中國制造到中國創(chuàng)造
- 2021-2022新教科版四年級(jí)科學(xué)下冊(cè)全一冊(cè)全部課件(共24課)
- 3 棄渣場(chǎng)施工方案
評(píng)論
0/150
提交評(píng)論