成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

在SQL Server中使用 Try Catch 處理異常的示例詳解

瀏覽:349日期:2023-03-06 14:25:15
目錄
  • 如何在 SQL Server 中使用 Try Catch 處理錯誤?
  • 示例:了解 SQL Server 中的 Try-Catch 實現。
  • 在 SQL Server 中使用 try-catch 的示例

如何在 SQL Server 中使用 Try Catch 處理錯誤?

從 SQL Server 2005 開始,我們在TRY 和 CATCH塊的幫助下提供了結構錯誤處理機制。使用TRY-CATCH的語法如下所示。

BEGIN TRY
--這里寫可能導致錯誤的語句
END TRY
BEGIN CATCH
--當錯誤發生后,這里的語句將會被執行
END CATCH
-- 其他語句

有可能拋出異常的SQL 語句需要放在BEGIN TRY和END TRY塊之間。如果在 TRY 塊中發生異常,則控制權立即轉移到相應的CATCH塊。如果 TRY 塊中沒有發生異常,則直接跳過CATCH塊,執行CATCH塊之后的語句。

注意:被 CATCH 捕獲的錯誤不會返回給調用應用程序。如果要將錯誤信息返回給調用應用程序,則需要將 RAISERROR() 函數顯式與 catch 塊一起使用。在之前的文章中,我們討論了如何使用 RAISERROR() 函數顯式地引發錯誤。參考: SQL Server 中的異常處理

示例:了解 SQL Server 中的 Try-Catch 實現。

在下面的示例中,我們使用 SQL Server TRY CATCH 實現和用戶定義的錯誤語句來創建一個用于除以 2 個變量值的存儲過程。

IF OBJECT_ID("spDivideTwoNumbers","P") IS NOT NULL
    DROP PROCEDURE spDivideTwoNumbers
GO
CREATE PROCEDURE spDivideTwoNumbers(
@Number1 INT, 
@Number2 INT
)
AS
BEGIN
  DECLARE @Result INT
  SET @Result = 0
  BEGIN TRY
    SET @Result = @Number1 / @Number2
    PRINT "結果是: " + CAST(@Result AS VARCHAR)
  END TRY
  BEGIN CATCH
    PRINT "第二個數字不能為0"
  END CATCH
END

讓我們來測試一下這個存儲過程

exec spDivideTwoNumbers 100,1

輸出: 結果是: 100

exec spDivideTwoNumbers 100,0

輸出: 第二個數字不能為0

當我們用正確的值執行上述存儲過程時,程序就不會出現錯誤。這意味著在執行完 try 塊中的所有語句后,控件直接跳轉到存在于 catch 塊之后的語句,而不執行 catch 塊。

如果在執行過程中,即在try塊中發生任何錯誤,那么在這種情況下,從發生錯誤的行開始,控制權直接跳轉到catch塊。所以 try 塊中的其余語句將不會執行,而 catch 塊將執行。

注意:在上面的程序中,當錯誤發生時,我們會顯示一條用戶自定義的錯誤消息“第二個數字不能為0”。然而,我們還可以通過調用函數 Error_Message 來顯示原始錯誤消息。為了測試這個重寫catch塊內的代碼如下

ALTER PROCEDURE spDivideTwoNumbers(
@Number1 INT, 
@Number2 INT
)
AS
BEGIN
  DECLARE @Result INT
  SET @Result = 0
  BEGIN TRY
    SET @Result = @Number1 / @Number2
    PRINT "結果是: " + CAST(@Result AS VARCHAR)
  END TRY
  BEGIN CATCH
    PRINT ERROR_MESSAGE()
  END CATCH
END

再次執行: exec spDivideTwoNumbers 100,0
輸出: 遇到以零作除數錯誤。

在 SQL Server 中使用 try-catch 的示例

我們將使用下面的 Product 和 ProductSales 表來了解如何使用 RaiseError 和 @ERROR 系統定義函數來處理 SQL Server 中的錯誤。

Product (產品表)

ProductIDNamePriceQuantity101Laptop15000100102Desktop20000150104Mobile3000200105Tablet4000250

ProductSales (產品銷售表)

ProductSalesIDProductIDQuantitySold110110210215310430410535

請使用以下 SQL 腳本創建并使用示例數據填充 Product 和 ProductSales 表。

IF OBJECT_ID("dbo.Product","U") IS NOT NULL
    DROP TABLE dbo.Product
IF OBJECT_ID("dbo.ProductSales","U") IS NOT NULL
    DROP TABLE dbo.ProductSales
GO
CREATE TABLE Product
(
  ProductID INT PRIMARY KEY, 
  Name VARCHAR(40), 
  Price INT,
  Quantity INT
 )
GO
INSERT INTO Product VALUES(101, "Laptop", 15000, 100)
INSERT INTO Product VALUES(102, "Desktop", 20000, 150)
INSERT INTO Product VALUES(103, "Mobile", 3000, 200)
INSERT INTO Product VALUES(104, "Tablet", 4000, 250)
GO
CREATE TABLE ProductSales
(
  ProductSalesId INT PRIMARY KEY,
  ProductId INT,
  QuantitySold INT
) 
GO
INSERT INTO ProductSales VALUES(1, 101, 10)
INSERT INTO ProductSales VALUES(2, 102, 15)
INSERT INTO ProductSales VALUES(3, 103, 30)
INSERT INTO ProductSales VALUES(4, 104, 35)
GO

在 SQL Server 中使用 TRY Catch 實現產品銷售的存儲過程

CREATE PROCEDURE spSellProduct
@ProductID INT,
@QuantityToSell INT
AS
BEGIN

  -- 首先我們需要檢查待銷售產品的可用庫存
  DECLARE @StockAvailable INT
  SELECT @StockAvailable = QuantityAvailable FROM Product WHERE ProductId = @ProductId

    --如果可用庫存小于要銷售的數量,拋出錯誤
  IF(@StockAvailable< @QuantityToSell)
  BEGIN
    Raiserror("可用庫存不足",16,1)
  END
  
  -- 如果可用庫存充足
  ELSE
  BEGIN
    BEGIN TRY
      -- 我們需要開啟一個事務
      BEGIN TRANSACTION

      -- 首先做減庫存操作
      UPDATE Product SET Quantity = (Quantity - @QuantityToSell) WHERE ProductID = @ProductID

      -- 計算當前最大的產品銷售ID,即 MaxProductSalesId
      DECLARE @MaxProductSalesId INT
      SELECT @MaxProductSalesId = CASE 
  WHEN  MAX(ProductSalesId) IS NULL THEN 0 
  ELSE MAX(ProductSalesId) 
  END 
      FROM ProductSales

      -- 把 @MaxProductSalesId 加一, 所以我們會避免主鍵沖突 
      --(解釋下,建表的時候,沒有設置主鍵自增,所以需要人工處理自增)
      Set @MaxProductSalesId = @MaxProductSalesId + 1

      -- 把銷售的產品數量記錄到ProductSales表中
      INSERT INTO ProductSales VALUES (@MaxProductSalesId, @ProductId, @QuantityToSell)

      -- 最后,提交事務
      COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
      -- 如果發生了異常,回滾事務
      ROLLBACK TRANSACTION
      -- 輸出錯誤詳情
      SELECT ERROR_NUMBER() as ErrorNumber,
  ERROR_MESSAGE() as ErrorMessage,
  ERROR_PROCEDURE() as ErrorProcedure,
  ERROR_STATE() as ErrorState,
  ERROR_SEVERITY() as ErrorSeverity,
  ERROR_LINE() as ErrorLine
    END CATCH
  End
END

在存儲過程 spSellProduct 中,Begin Transaction 和 Commit Transaction 語句被包裝在 Begin Try 和 End Try 塊之間。如果包含在 BEGIN TRY 和 END TRY 塊中的代碼沒有發生錯誤,則執行 COMMIT TRANSACTION 語句并將更改永久保存到數據庫。

如果在 try 塊中發生錯誤,則立即跳轉到 CATCH 塊,并且在 CATCH 塊中,我們正在回滾事務。因此,使用 Try/Catch 構造處理錯誤比使用 SQL Server 中的 @@Error 系統函數要容易得多。

SQL Server 還提供了一些我們可以在 CATCH 塊范圍內使用的內置函數,這些函數用于檢索有關發生的錯誤的更多信息,如果這些函數在 CATCH 塊范圍之外執行,它們將返回 NULL。

注意:我們不能在用戶定義的函數中使用 TRY/CATCH

到此這篇關于在 SQL Server 中使用 Try Catch 處理異常的文章就介紹到這了,更多相關SQL Server 使用 Try Catch 處理異常內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MsSQL
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产宾馆实践打屁股91| 精品国产乱码久久久久久牛牛| 欧美高清视频一区二区三区在线观看| 亚洲欧美日韩另类精品一区二区三区| 欧美乱妇15p| 香蕉加勒比综合久久| 欧美日韩成人| 欧美tickle裸体挠脚心vk| 一二三四区精品视频| 成人av先锋影音| 日韩片之四级片| 国产激情91久久精品导航| 欧美三区在线观看| 日韩av网站免费在线| 久久男女视频| 日韩高清在线电影| 久久国产欧美| 亚洲自拍偷拍网站| 在线播放一区| 中文成人综合网| 97精品超碰一区二区三区| 日韩精品一区国产麻豆| 国产精品12区| 欧美亚洲国产bt| 日韩电影在线观看电影| 午夜在线观看免费一区| 亚洲国产欧美日韩另类综合 | 亚洲一区bb| 亚洲激情综合网| 日韩香蕉视频| 一区二区三区四区不卡视频| 在线欧美福利| 欧美丰满美乳xxx高潮www| 韩国一区二区三区| 69堂成人精品免费视频| 国产一区二区三区四区五区入口| 欧美乱熟臀69xxxxxx| 国产91在线观看丝袜| 欧美一区二区三区四区在线观看| 日本欧美一区二区在线观看| 一本大道av一区二区在线播放| 日韩黄色免费电影| 欧美日韩国产首页| av在线这里只有精品| 久久久美女毛片| 91理论电影在线观看| 国产欧美日韩在线观看| 丰满白嫩尤物一区二区| 亚洲午夜在线电影| 欧美亚洲国产一区二区三区va | 国产精品chinese| 久久成人亚洲| 日韩精品一区二区三区视频播放| 精品一区二区三区在线观看| 色婷婷精品久久二区二区蜜臂av | 欧美亚洲图片小说| 美女免费视频一区| 99国产精品| 奇米精品一区二区三区在线观看| 欧美自拍偷拍午夜视频| 粉嫩欧美一区二区三区高清影视| 久久久精品中文字幕麻豆发布| 欧美久久九九| 亚洲一区二区三区爽爽爽爽爽| 在线精品视频免费播放| 99久久er热在这里只有精品15 | 日韩精品电影一区亚洲| 91国偷自产一区二区开放时间 | 欧美日韩精品一区二区三区四区 | 欧美日韩高清一区二区三区| 国产乱妇无码大片在线观看| 欧美高清在线视频| 性色一区二区| 99久久久久免费精品国产| 欧美一区二区三区视频| 国产福利91精品一区二区三区| 欧美一区二区免费| 国产专区综合网| 欧美一区二区三区影视| 成人精品一区二区三区四区| 精品久久久三级丝袜| heyzo一本久久综合| 日韩欧美一区二区在线视频| 成人手机电影网| 99久久久久久| 欧美亚洲综合久久| 亚洲人成网站影音先锋播放| 91老师片黄在线观看| 日韩一区二区三区精品视频| 韩国精品免费视频| 欧美亚洲愉拍一区二区| 日本午夜一本久久久综合| 亚洲欧美日韩在线观看a三区| 久久精彩视频| 亚洲在线中文字幕| 狂野欧美一区| 国产综合久久久久影院| 成人动漫一区二区在线| 中文字幕成人av| 免费久久99精品国产自| 韩国v欧美v亚洲v日本v| 欧美一级视频精品观看| 制服丝袜亚洲精品中文字幕| 99re在线视频这里只有精品| 无码av免费一区二区三区试看 | 亚洲区一区二| 亚洲成人免费影院| 91精品综合久久久久久| 欧美日韩伊人| 免费看黄色91| 欧美日韩国产免费观看 | 久久影院电视剧免费观看| 欧美日韩精品| 亚洲第一成人在线| 337p亚洲精品色噜噜| 欧美国产综合视频| 亚洲一区二区三区不卡国产欧美 | 亚洲国产成人不卡| 青草国产精品久久久久久| 欧美精品日韩一区| 黑人中文字幕一区二区三区| 日韩高清在线观看| 国产亚洲精品7777| 亚洲综合精品| 蜜桃免费网站一区二区三区| 5566中文字幕一区二区电影| 亚洲黄色精品| 欧美一区二区三区四区夜夜大片| 日本91福利区| 一区二区三区成人| 精品国产精品一区二区夜夜嗨| 久久一区二区三区超碰国产精品| 欧美日韩亚洲一区二区三区四区| 国产精品一区二区无线| 日韩av不卡一区二区| 亚洲黄色性网站| 欧美激情自拍偷拍| 精品日韩成人av| 4438亚洲最大| 欧美色图12p| 精品国产乱码久久| 国产精品日韩欧美一区二区| www.性欧美| 免费久久精品视频| 亚洲色图都市小说| 日韩视频123| 色婷婷综合久久久久中文| 欧美不卡高清| 久久精品国产亚洲一区二区三区| 欧美激情综合五月色丁香小说| 欧美综合久久久| 亚洲人成在线影院| 不卡的电视剧免费网站有什么| 天堂蜜桃91精品| 国产精品久久久久久久久久免费看 | 91免费在线播放| 久久66热re国产| 亚洲综合色在线| 国产亚洲欧洲997久久综合| 欧美日韩一区二区电影| 在线视频精品一区| 色综合久久中文综合久久97| 精品亚洲欧美一区| 一区二区激情视频| 久久久久久久久久久久久夜| 欧美丰满一区二区免费视频| 亚洲一区二区毛片| 色综合天天综合狠狠| 国产乱一区二区| 午夜精品久久久久久久蜜桃app| 欧美大白屁股肥臀xxxxxx| 久久婷婷丁香| 在线播放豆国产99亚洲| 成人午夜视频在线观看| 日韩1区2区日韩1区2区| 日韩美女久久久| 精品国产精品一区二区夜夜嗨| 欧美三级午夜理伦三级中视频| 亚洲在线黄色| 夜夜爽av福利精品导航| 国产精品99免费看| 91色综合久久久久婷婷| 国产精品1区2区| 免费在线观看不卡| 亚洲视频一区二区在线| 亚洲精品一区二区三区樱花| 99久久久国产精品| 欧美在线播放一区| 黄色日韩在线| 亚洲大片在线| 中文日韩欧美| 亚洲一区成人在线| 日韩欧美成人一区二区| 91精品国产综合久久婷婷香蕉 | 亚洲狠狠爱一区二区三区| 亚洲免费观看高清完整版在线| 欧美国产一区在线| 26uuu精品一区二区| 337p日本欧洲亚洲大胆精品| 日韩欧美在线观看一区二区三区|