SQL入門經典(八)之存儲過程

来源:http://www.cnblogs.com/panda951010/archive/2016/06/25/5616077.html
-Advertisement-
Play Games

存儲過程(stored procedure)有時候稱為sproc,它是真正的腳本-或者更準確的說,他是批處理(batch)-它存儲於資料庫中,而不是淡出的文件中。無論如何,這個比較並不是很確定。存儲過程有輸出參數,輸入參數已及返回值等。而腳本不會有這些內容。 存儲過程基本語法:CREATE PROC ...


     存儲過程(stored procedure)有時候稱為sproc,它是真正的腳本-或者更準確的說,他是批處理(batch)-它存儲於資料庫中,而不是淡出的文件中。無論如何,這個比較並不是很確定。存儲過程有輸出參數,輸入參數已及返回值等。而腳本不會有這些內容。

存儲過程基本語法:CREATE PROCEDURE|PROC <sproc name>

                         [<parameter name> <data type> [VARYING][<default value>] [OUTPUT]],

                         [<parameter name> <data type> [VARYING][<default value>] [OUTPUT]]

                         [........,n]

                         [WITH PECOMPILE|ENCRYPTION|EXECUTE AS{ CALLER |SELF|OWNER|<'user name '>}]

                         [ FOR REPLICATION]

                         AS

                         <code>|EXTERNAL NAME<assembly name>.<assembly class>.<method>

試一試最簡單基本存儲過程:

USE AdventureWorks
GO --切換到AdventureWorks資料庫

CREATE PROCEDURE sp_Employee
AS 
SELECT * FROM HumanResources.Employee

GO--提前處理語句。防止下麵EXEC sp_Employee拋出錯誤

exec sp_Employee

看起來是不是很簡單。返回一個data表。沒有參數的存儲過程。

使用ALTER 修改存儲過程。

在使用T-SQL編輯存儲過程需要註意,這是完全替換現有的存儲過程。使用ALTER PROC還是CREATE PROC語句的唯一缺點包括以下幾點:

1.ALTER PROC:期望找到一個已有的存儲過程,而CREATE不是。

2.ALTER PROC:保留存儲過程上已經建立的任何許可權。它在系統對象中保留了相同的對象ID並允許保留依賴關係。如:過程A調用過程B,並刪除和重新創建了過程B,那麼不能在看到這二者的依賴關係了。如果使用ALTER ,依賴關係仍然存在。

3.ALTER PROC:在可能調用被修改的存儲過程的其他對象上保留任何依賴信息(這一條也是最重要的)。

 刪除儲存過程:這個最簡單不過了。還是刪除資料庫、表和視圖等對象通用語句,

                     DROP PROC|PROCEDURE  <sporcedure name> 就完成整個刪除工作了。

使用參數化存儲過程:

聲明參數是需要下麵2-4條信息:名稱,數據類型,預設值,反向。其語法:@parameter_name [AS] datatype  [=defalut|NULL] [VARYING ] [OUTPUT|OUT]

創建一個和前面不同版本的存儲過程

USE AdventureWorks
GO --切換到AdventureWorks資料庫

CREATE PROCEDURE sp_Contact
@LastName nvarchar(50) 
AS 
SELECT * FROM Person.Contact WHERE LastName LIKE '%'+@LastName+'%'

exec sp_Contact --未提供值, 消息 201,級別 16,狀態 4,過程 sp_Contact,第 0 行 過程或函數 'sp_Contact' 需要參數 '@LastName',但未提供該參數。
exec sp_Contact 'ad' --查詢完成共233條信息

如何獲取輸出參數並有返回值:在做分頁查詢時候會用到這種。先看下存儲過程

CREATE PROCEDURE sp_ContactPage
@pageStart int,
@pageEnd   int,
@pageCount int OUTPUT
AS 
begin
     SELECT @pageCount=count(1) FROM Person.Contact;--獲取總條數。並且設置@pageCount的值
     WITH Contact as( select row_number() over(order by ContactID desc) as RowNumber,*  from Person.Contact)
     SELECT * from Contact where  RowNumber between @pageStart and @pageEnd; --分頁查詢,在sql server 2012有更簡單分頁查詢。這是SQL SERVER 2005以後支持。2000需要子查詢。博客後面會介紹漏掉的子查詢和索引,SQL腳本這些。
end 

declare @rowcount int 
exec sp_ContactPage 0,20,@rowcount output

select @rowcount
View Code

如何使用返回值來獲取錯誤結果:

CREATE PROCEDURE sp_errorLogin
@username nvarchar(20), 
@userpass nvarchar(30)
AS
begin 
    if(@username!='admin')
       return -1;--表示用戶名不存在(為了方便不使用資料庫了)
    if(@userpass!='admin')
       return 1;--密碼錯誤
    return 0;--登錄成功
end
declare @status int ;
exec @status= sp_errorLogin 'admin','222'
select @status as '密碼錯誤'
exec @status= sp_errorLogin '222','222'
select @status as '帳號錯誤'
exec @status= sp_errorLogin 'admin','admin'
select @status as '登錄成功'
View Code

後面章節講@@Error和try....cacth的異常處理,我把它們放在事務里講了。因為事務發生錯誤就會rollback tran。

遞歸:編程很少會用到遞歸,有時候遞歸是最有效的解決方案,如菜單樹。遞歸是指一條代碼自身調用自身的情況,危險性也是很明顯-就是進行死迴圈的調用。如何調用取決你或者代碼。SQL遞歸調用最多只有32次,超過32次就會拋出異常。

最經典的就是階乘如:5的階乘120它是如何實現 5*4*3*2*1。

CREATE proc sp_jx
@size int ,
@count int output
AS
   declare @temp_s int ;
   declare @temp_c int ;
   if @size >=1
     begin
       select @temp_s=@size-1;
       exec sp_jx @temp_s,@temp_c output
       select @count= @size*@temp_c;
     end
   else
     select @count=1 
return 
GO
declare @count int 
exec sp_jx 5,@count output 
select @count

exec sp_jx 32,@count output 
select @count
View Code

 

使用存儲過程的時機:(優點)

1.通常更佳的性能。

2.可以作為安全隔離層(控制數據訪問和跟新方式)

3.可以重用代碼

4.劃分代碼

5.根據在運行時建立的動態而可以靈活執行

缺點

移植性差,不能跨平臺移植

在一些情況下可能因為錯誤的執行計劃而被鎖定(實際影響性能).

未完待續。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • sql資料庫表連接,主要分為:內連接、外連接(左連接、右連接 、全連接)、交叉連接,今天統一整合一下,看看他們的區別。 首先建表填充值。 學生表:student(id,姓名,年齡,性別 ) 成績表:score(id,學生id,成績) 一、內連接(inner join……on) select stud ...
  • CentOS7 之 Redis3 學習筆記 1 Redis 官網: http://www.redis.io/ 2 Redis 的下載地址: http://download.redis.io/releases/redis-3.0.7.tar.gz 這裡我們下載的是 redis-3.0.7.tar.gz ...
  • UDF和存儲過程很類似,用戶自定義函數是一組有序的T-SQL語句,這些語句被預先優化和編譯,並且可以作為一個單元來測試調用。UDF和存儲過程的主要區別在於結果返回方式,為了能支持更多返回值,UDF比存儲過程有跟多限制。 UDF基本語法:CREATE FUNCTION <function name> ...
  • mysql資料庫是被廣泛應用的關係型資料庫,其體積小、支持多處理器、開源並免費的特性使其在Internet中小型網站中的使用率尤其高。在使用mysql的過程中不規範的sql編寫、非最優的策略選擇都可能導致系統性能甚至功能上的缺陷。 ...
  • 推薦:http://www.cnblogs.com/roucheng/p/GUID.html ...
  • Oracle用戶被鎖原因及辦法 在登陸時被告知test用戶被鎖 1、用dba角色的用戶登陸,進行解鎖,先設置具體時間格式,以便查看具體時間 SQL> alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’; Session altered. ...
  • 在 CentOS7 上安裝 MongoDB 1 通過 SecureCRT 連接至 CentOS7 伺服器; 2 進入到 /usr/local/ 目錄: cd /usr/local 3 在當前目錄下創建 tools 目錄: mkdir -p tools 4 進入到 tools 目錄中: cd tool ...
  • 在 CentOS7 上安裝 MySQL5.7 1 通過 SecureCRT 連接到阿裡雲 CentOS7 伺服器; 2 進入到目錄 /usr/local/ 中: cd /usr/local/ 3 創建目錄 /usr/local/tools,如果有則忽略: mkdir -p tools 4 創建 /u ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...