亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL數據庫存儲過程示例解析

2024-08-31 01:03:47
字體:
來源:轉載
供稿:網友
這篇文章主要針對SQL數據庫存儲過程示例進行解析,感興趣的小伙伴們可以參考一下
 

什么是存儲過程:存儲過程可以說是一個記錄集吧,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然后再給這個代碼塊取一個名字,在用到這個功能的時候調用他就行了。

存儲過程的好處:

1.由于數據庫執行動作時,是先編譯后執行的。然而存儲過程是一個編譯過的代碼塊,所以執行效率要比T-SQL語句高。

2.一個存儲過程在程序在網絡中交互時可以替代大堆的T-SQL語句,所以也能降低網絡的通信量,提高通信速率。

3.通過存儲過程能夠使沒有權限的用戶在控制之下間接地存取數據庫,從而確保數據的安全。

小結:總之存儲過程是好東西,在做項目時屬于必備利器,下面介紹存儲過程的基本語法。

存儲過程的語法和參數講解

存儲過程的一些基本語法:

--------------創建存儲過程-----------------CREATE PROC [ EDURE ] procedure_name [ ; number ]  [ { @parameter data_type }    [ VARYING ] [ = default ] [ OUTPUT ]  ] [ ,...n ][ WITH  { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]--------------調用存儲過程-----------------EXECUTE Procedure_name '' --存儲過程如果有參數,后面加參數格式為:@參數名=value,也可直接為參數值value--------------刪除存儲過程-----------------drop procedure procedure_name  --在存儲過程中能調用另外一個存儲過程,而不能刪除另外一個存儲過程

創建存儲過程的參數:
1.procedure_name :存儲過程的名稱,在前面加#為局部臨時存儲過程,加##為全局臨時存儲過程。

2.; number:是可選的整數,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應用程序使用的過程可以命名為 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 語句將除去整個組。如果名稱中包含定界標識符,則數字不應包含在標識符中,只應在 procedure_name 前后使用適當的定界符。

3.@parameter: 存儲過程的參數。可以有一個或多個。用戶必須在執行過程時提供每個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多可以有 2.100 個參數。 
使用 @ 符號作為第一個字符來指定參數名稱。參數名稱必須符合標識符的規則。每個過程的參數僅用于該過程本身;相同的參數名稱可以用在其它過程中。默認情況下,參數只能代替常量,而不能用于代替表名、列名或其它數據庫對象的名稱。有關更多信息,請參見 EXECUTE。

4.data_type:參數的數據類型。所有數據類型(包括 text、ntext 和 image)均可以用作存儲過程的參數。不過,cursor 數據類型只能用于 OUTPUT 參數。如果指定的數據類型為 cursor,也必須同時指定 VARYING 和 OUTPUT 關鍵字。有關 SQL Server 提供的數據類型及其語法的更多信息,請參見數據類型。 
說明 對于可以是 cursor 數據類型的輸出參數,沒有最大數目的限制。

5.VARYING: 指定作為輸出參數支持的結果集(由存儲過程動態構造,內容可以變化)。僅適用于游標參數。

6.default: 參數的默認值。如果定義了默認值,不必指定該參數的值即可執行過程。默認值必須是常量或 NULL。如果過程將對該參數使用 LIKE 關鍵字,那么默認值中可以包含通配符(%、_、[] 和 [^])。

7.OUTPUT :表明參數是返回參數。該選項的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數可將信息返回給調用過程。Text、ntext 和 image 參數可用作 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以是游標占位符。

8.RECOMPILE: 表明 SQL Server 不會緩存該過程的計劃,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。

9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復制的一部分發布。 說明 在升級過程中,SQL Server 利用存儲在 syscomments 中的加密注釋來重新創建加密過程。

10.FOR REPLICATION :指定不能在訂閱服務器上執行為復制創建的存儲過程。.使用 FOR REPLICATION 選項創建的存儲過程可用作存儲過程篩選,且只能在復制過程中執行。本選項不能和 WITH RECOMPILE 選項一起使用。

11.AS :指定過程要執行的操作。

12.sql_statement :過程中要包含的任意數目和類型的 Transact-SQL 語句。但有一些限制。

小結:看過這些基本語法后,下面我就根據語法創建各式的存儲過程。

 創建存儲過程

 SQL數據庫,存儲過程

針對上面的表,我使用存儲過程對它做一些操作:

1. 只返回單一記錄集的存儲過程 

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountasselect * from UserAccountgo-------------執行上面的存儲過程----------------exec GetUserAccount

結果:相當于運行 select * from UserAccount 這行代碼,結果為整個表的數據。

2.沒有輸入輸出的存儲過程 

-------------創建名為GetUserAccount的存儲過程----------------create Procedure inUserAccountasinsert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9)go-------------執行上面的存儲過程----------------exec inUserAccount

結果:相當于運行 insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9) 這行代碼。

3.有返回值的存儲過程 

-------------創建名為GetUserAccount的存儲過程----------------create Procedure inUserAccountReasinsert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(10,10,'2013-01-02',10)return @@rowcountgo-------------執行上面的存儲過程----------------exec inUserAccountRe

解釋:這里的@@rowcount為執行存儲過程影響的行數,執行的結果是不僅插入了一條數據,還返回了一個值即 return value =1  ,這個可以在程序中獲取,稍后在c#調用存儲過程中會有說到。

4.有輸入參數和輸出參數的存儲過程 

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000go-------------執行上面的存儲過程----------------exec GetUserAccountRe '7',null

解釋:@UserName為輸入參數,@UserID為輸出參數。 運行結果為@userID為COOUT(*)即 =1。

5. 同時具有返回值、輸入參數、輸出參數的存儲過程 

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe1@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000return @@rowcountgo-------------執行上面的存儲過程----------------exec GetUserAccountRe1 '7',null

結果:@userID為COOUT(*)即 =1,Retun Value=1。

6.同時返回參數和記錄集的存儲過程 

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe2@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000select * from UserAccountreturn @@rowcountgo-------------執行上面的存儲過程----------------exec GetUserAccountRe2 '7',null

結果:返回執行 select * from UserAccount 這句代碼的結果集,同時@userID為COOUT(*)即 =1,Retun Value=9。

7.返回多個記錄集的存儲過程 

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe3asselect * from UserAccountselect * from UserAccount where UserID>5go-------------執行上面的存儲過程----------------exec GetUserAccountRe3

結果:返回兩個結果集,一個為 select * from UserAccount,另一個為 select * from UserAccount where UserID>5 。

小結:上面我們創建了各式的存儲過程,下面看我們在c#中怎樣調用這些存儲過程。

C#調用存儲過程

這里調用的存儲過程為上面我寫的那些各式各樣的存儲過程。

public partial class ProcedureTest : System.Web.UI.Page  {    public static string conn = ConfigurationManager.ConnectionStrings["StuRelationDBConnectionString"].ConnectionString;    public SqlConnection con = new SqlConnection(conn);    protected void Page_Load(object sender, EventArgs e)    {      runGetUserAccountRe3();    }    //只返回單一記錄集的存儲過程GetUserAccount    public void runGetUserAccount()    {      SqlDataAdapter dp = new SqlDataAdapter(common("GetUserAccount"));      DataSet ds = new DataSet();      // 填充dataset       dp.Fill(ds);      rpt.DataSource = ds;      rpt.DataBind();    }    //沒有輸入輸出的存儲過程inUserAccount    public void runinUserAccount()    {            con.Open();      Label1.Text = common("inUserAccount").ExecuteNonQuery().ToString();      con.Close();    }    //有返回值的存儲過程inUserAccountRe    public void runinUserAccountRe()    {      // 創建參數       SqlCommand cmd = common("inUserAccountRe");      IDataParameter[] parameters = {          new SqlParameter("rval", SqlDbType.Int,4)        };      // 將參數類型設置為 返回值類型       parameters[0].Direction = ParameterDirection.ReturnValue;      // 添加參數       cmd.Parameters.Add(parameters[0]);      con.Open();      // 執行存儲過程并返回影響的行數       Label1.Text = cmd.ExecuteNonQuery().ToString();      con.Close();      // 顯示影響的行數和返回值       Label1.Text += "-" + parameters[0].Value.ToString();    }    //有輸入參數和輸出參數的存儲過程    public void runGetUserAccountRe()    {      SqlCommand cmd = common("GetUserAccountRe");      // 創建參數       IDataParameter[] parameters = {          new SqlParameter("@UserName", SqlDbType.NChar,20) ,          new SqlParameter("@UserID", SqlDbType.Int) ,       };      // 設置參數類型       parameters[0].Value = "7";       parameters[1].Direction = ParameterDirection.Output; // 設置為輸出參數       // 添加參數       cmd.Parameters.Add(parameters[0]);      cmd.Parameters.Add(parameters[1]);      con.Open();      // 執行存儲過程并返回影響的行數       Label1.Text = cmd.ExecuteNonQuery().ToString();      con.Close();            // 顯示影響的行數和輸出參數       Label1.Text += "-" + parameters[1].Value.ToString();          }    //同時具有返回值、輸入參數、輸出參數的存儲過程GetUserAccountRe1    public void runGetUserAccountRe1()    {      SqlCommand cmd = common("GetUserAccountRe1");      // 創建參數       IDataParameter[] parameters = {          new SqlParameter("@UserName", SqlDbType.NChar,20) ,          new SqlParameter("@UserID", SqlDbType.Int) ,         new SqlParameter("rval", SqlDbType.Int,4)        };      // 設置參數類型       parameters[0].Value = "7";      parameters[1].Direction = ParameterDirection.Output; // 設置為輸出參數       parameters[2].Direction = ParameterDirection.ReturnValue; //設置為返回值      // 添加參數       cmd.Parameters.Add(parameters[0]);      cmd.Parameters.Add(parameters[1]);      cmd.Parameters.Add(parameters[2]);      con.Open();      // 執行存儲過程并返回影響的行數       Label1.Text = cmd.ExecuteNonQuery().ToString();      con.Close();      // 顯示影響的行數和輸出參數       Label1.Text += "-輸出參數為:" + parameters[1].Value.ToString();      Label1.Text += "-返回值為:" + parameters[2].Value.ToString();    }    //同時返回參數和記錄集的存儲過程GetUserAccountRe2    public void runGetUserAccountRe2()    {      SqlCommand cmd = common("GetUserAccountRe2");      // 創建參數       IDataParameter[] parameters = {          new SqlParameter("@UserName", SqlDbType.NChar,20) ,          new SqlParameter("@UserID", SqlDbType.Int) ,         new SqlParameter("rval", SqlDbType.Int,4)        };      // 設置參數類型       parameters[0].Value = "7";      parameters[1].Direction = ParameterDirection.Output; // 設置為輸出參數       parameters[2].Direction = ParameterDirection.ReturnValue; //設置為返回值      // 添加參數       cmd.Parameters.Add(parameters[0]);      cmd.Parameters.Add(parameters[1]);      cmd.Parameters.Add(parameters[2]);      con.Open();      // 執行存儲過程并返回影響的行數       Label1.Text = cmd.ExecuteNonQuery().ToString();      DataSet ds = new DataSet();      SqlDataAdapter dt = new SqlDataAdapter(cmd);      dt.Fill(ds);      rpt.DataSource = ds;      rpt.DataBind();      con.Close();      // 顯示影響的行數和輸出參數       Label1.Text += "-輸出參數為:" + parameters[1].Value.ToString();      Label1.Text += "-返回值為:" + parameters[2].Value.ToString();    }    //返回多個記錄集的存儲過程    public void runGetUserAccountRe3()    {      DataSet ds = new DataSet();      SqlDataAdapter dt = new SqlDataAdapter(common("GetUserAccountRe3"));      dt.Fill(ds);      rpt1.DataSource = ds.Tables[0].DefaultView;      rpt1.DataBind();      rpt2.DataSource = ds.Tables[1].DefaultView;      rpt2.DataBind();    }        public SqlCommand common(string proName)    {            SqlCommand cmd = new SqlCommand();      // 設置sql連接       cmd.Connection = con;            // 如果執行語句       cmd.CommandText = proName;      // 指定執行語句為存儲過程       cmd.CommandType = CommandType.StoredProcedure;      return cmd;    }  }

附帶SQLServer數據庫的一些全局變量

select APP_NAME ( ) as w --當前會話的應用程序select @@IDENTITY  --返回最后插入的標識值 select USER_NAME()  --返回用戶數據庫用戶名SELECT @@CONNECTIONS --返回自上次SQL啟動以來連接或試圖連接的次數。 SELECT GETDATE() --當前時間 SELECT @@CPU_BUSY/100 --返回自上次啟動SQL 以來 CPU 的工作時間,單位為毫秒USE tempdb SELECT @@DBTS as w --為當前數據庫返回當前 timestamp 數據類型的值。這一 timestamp 值保證在數據庫中是唯一的。 select @@IDENTITY as w --返回最后插入的標識值 SELECT @@IDLE as w --返回SQL自上次啟動后閑置的時間,單位為毫秒 SELECT @@IO_BUSY AS w  --返回SQL自上次啟動后用于執行輸入和輸出操作的時間,單位為毫秒 SELECT @@LANGID AS w  --返回當前所使用語言的本地語言標識符(ID)。 SELECT @@LANGUAGE AS w  --返回當前使用的語言名 SELECT @@LOCK_TIMEOUT as w --當前會話的當前鎖超時設置,單位為毫秒。 SELECT @@MAX_CONNECTIONS as w --返回SQL上允許的同時用戶連接的最大數。返回的數不必為當前配置的數值 EXEC sp_configure --顯示當前服務器的全局配置設置 SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 數據類型所用的精度級別,即該服務器中當前設置的精度。默認最大精度38。 select @@OPTIONS as w --返回當前 SET 選項的信息。 SELECT @@PACK_RECEIVED as w --返回SQL自啟動后從網絡上讀取的輸入數據包數目。 SELECT @@PACK_SENT as w --返回SQ自上次啟動后寫到網絡上的輸出數據包數目。 SELECT @@PACKET_ERRORS as w --返回自SQL啟動后,在SQL連接上發生的網絡數據包錯誤數。 SELECT @@SERVERNAME as w --返回運行SQL服務器名稱。 SELECT @@SERVICENAME as w --返回SQL正在其下運行的注冊表鍵名 SELECT @@TIMETICKS as w --返回SQL服務器一刻度的微秒數 SELECT @@TOTAL_ERRORS AS w --返回 SQL服務器自啟動后,所遇到的磁盤讀/寫錯誤數。 SELECT @@TOTAL_READ as w --返回 SQL服務器自啟動后讀取磁盤的次數。 SELECT @@TOTAL_WRITE as w --返回SQL服務器自啟動后寫入磁盤的次數。 SELECT @@TRANCOUNT as w --返回當前連接的活動事務數。 SELECT @@VERSION as w --返回SQL服務器安裝的日期、版本和處理器類型。 

以上就是本文的全部內容,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品videossex性护士| 91精品成人久久| 精品五月天久久| 国产精品国语对白| 国产有码一区二区| 久久国产加勒比精品无码| 伊人青青综合网站| 亚洲第一区中文字幕| 精品电影在线观看| 欧美激情videos| 久久国产精品电影| 久久伊人91精品综合网站| 国产91精品视频在线观看| 国产精品第1页| 国内外成人免费激情在线视频网站| 欧美夜福利tv在线| 2019中文字幕在线免费观看| 成人免费黄色网| 国产精品免费在线免费| 精品国偷自产在线视频| 国产日韩欧美日韩大片| 国产精品中文字幕在线| 日韩欧美大尺度| 98精品在线视频| 亚洲淫片在线视频| 久久全球大尺度高清视频| 欧美夜福利tv在线| 亚洲免费伊人电影在线观看av| 亚洲精品久久久久中文字幕欢迎你| 国产精品情侣自拍| 久久精品国产亚洲7777| 日韩美女在线观看一区| 国产97在线|亚洲| 在线电影欧美日韩一区二区私密| 国产欧美va欧美va香蕉在线| 欧美激情a∨在线视频播放| 欧美视频在线免费看| 国产亚洲综合久久| 亚洲在线视频观看| 成人免费午夜电影| 中文亚洲视频在线| 欧美日韩国内自拍| 精品视频在线播放免| 欧美午夜www高清视频| 国产精品日韩久久久久| 久久久久久综合网天天| 欧美午夜丰满在线18影院| 日韩精品有码在线观看| 国内精品视频在线| 久久久成人的性感天堂| 尤物99国产成人精品视频| 91视频88av| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品美女免费视频| 91豆花精品一区| 亚洲国产另类 国产精品国产免费| 国产不卡av在线| 三级精品视频久久久久| 日韩中文字幕网站| 亚洲欧美日本伦理| 亚洲综合中文字幕在线观看| 中文字幕日韩精品有码视频| 亚洲欧美日韩网| 日韩av高清不卡| 深夜精品寂寞黄网站在线观看| 伊人伊成久久人综合网站| 久久久www成人免费精品张筱雨| 欧洲精品在线视频| 欧美成人激情视频免费观看| 日韩精品999| 欧美—级高清免费播放| 国产精品日本精品| 亚洲精品久久久久国产| 欧美在线免费观看| 久久久av电影| 日韩精品在线观看一区二区| 欧美激情亚洲激情| 91精品国产乱码久久久久久久久| 色综合久久88| 亚洲aa在线观看| 久久久999成人| 国产男女猛烈无遮挡91| 一区二区三区日韩在线| 91av在线视频观看| 精品动漫一区二区| 国产97在线亚洲| 97超级碰在线看视频免费在线看| 国产精品网站视频| 久久99热精品| 亚洲第一网站男人都懂| 美女视频黄免费的亚洲男人天堂| 日本欧美在线视频| www国产亚洲精品久久网站| 欧美综合在线第二页| 国产精品成人观看视频国产奇米| 狠狠色狠狠色综合日日小说| 91免费综合在线| 国产精品99久久久久久白浆小说| 国产日韩在线免费| 俺去亚洲欧洲欧美日韩| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲成人a级网| 欧美视频在线免费| 久久久亚洲成人| 亚洲精品永久免费| 欧美激情一区二区三区久久久| 欧洲美女免费图片一区| 最近中文字幕日韩精品| 欧美成人精品在线视频| 精品视频在线播放色网色视频| 欧美日韩综合视频| 久久影视电视剧免费网站清宫辞电视| 欧美精品videossex88| 亚洲另类欧美自拍| 欧美人与性动交a欧美精品| 中文字幕亚洲一区在线观看| 欧美在线视频一区二区| 久久久亚洲影院你懂的| 精品国产老师黑色丝袜高跟鞋| 亚洲毛片在线观看| 亚洲女同性videos| 欧美大奶子在线| 91系列在线播放| 亚洲日本成人女熟在线观看| 久久天天躁夜夜躁狠狠躁2022| 91影视免费在线观看| 亚洲一区www| 国产拍精品一二三| 日韩av片免费在线观看| 在线免费看av不卡| 欧美色视频日本版| 中文字幕综合在线| 欧美日韩中国免费专区在线看| 日韩国产高清视频在线| 久久人人97超碰精品888| 日韩欧美国产中文字幕| 欧美激情手机在线视频| 国产成人综合av| 久久免费福利视频| 日韩免费不卡av| 国产热re99久久6国产精品| 米奇精品一区二区三区在线观看| 国产成人一区二区| 欧美日韩亚洲精品一区二区三区| 亚洲免费电影一区| 国产亚洲美女精品久久久| 美女性感视频久久久| 一区二区在线视频播放| 国产精品日韩欧美大师| 91精品国产91久久久久福利| 欧美香蕉大胸在线视频观看| 精品少妇一区二区30p| 8050国产精品久久久久久| 91美女片黄在线观看游戏| 97人人爽人人喊人人模波多| 国内外成人免费激情在线视频网站| 久久国内精品一国内精品| 色哟哟网站入口亚洲精品| 97超碰蝌蚪网人人做人人爽| 欧美日韩国产中文字幕| 国产精品久久久久久久天堂| 欧美性xxxxx| 欧美壮男野外gaytube| 深夜福利91大全|