日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:388日期: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
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美色图一区| 天堂√8在线中文| 国产传媒在线| 欧美性感美女一区二区| 国产一区二区色噜噜| 在线亚洲人成| 国产精品久久观看| 亚洲涩涩在线| 一区二区三区四区在线看| 在线日韩中文| 亚洲一级二级| 午夜在线一区二区| 在线亚洲观看| 国产欧美二区| 黑森林国产精品av| 在线中文字幕播放| 四虎4545www国产精品| 亚洲一二av| 日韩美女精品| 精品视频久久| 亚洲作爱视频| 国产一级一区二区| 日本不卡视频一二三区| 国产精品一页| а√天堂8资源在线| 免费av一区二区三区四区| 久久国产免费看| 免费欧美一区| 宅男噜噜噜66国产日韩在线观看| 亚洲伊人精品酒店| 国产麻豆一区| 亚洲va中文在线播放免费| 欧美精品一卡| 国产成人久久| 亚洲不卡av不卡一区二区| 国产午夜精品一区在线观看| 国产极品久久久久久久久波多结野| 女人天堂亚洲aⅴ在线观看| 国产视频久久| 国产乱子精品一区二区在线观看 | 黄色日韩精品| 日韩国产在线一| 国产在线日韩精品| 香蕉久久夜色精品国产| 国产精品久久久一区二区| 日韩欧美一区二区三区在线观看 | 日本视频在线一区| 婷婷精品进入| 亚洲2区在线| 亚洲一区二区三区四区五区午夜 | 开心激情综合| 日韩成人午夜精品| 视频在线不卡免费观看| 欧美日本二区| 日韩成人综合| 首页欧美精品中文字幕| 136国产福利精品导航网址| 日韩在线卡一卡二| 韩国一区二区三区视频| 亚洲欧美日韩国产综合精品二区 | 成午夜精品一区二区三区软件| 亚洲尤物在线| 麻豆成全视频免费观看在线看| 亚洲理论在线| 国产日韩电影| 日韩不卡一区二区三区| 99成人超碰| 久久av导航| 国产亚洲欧洲| 日产午夜精品一线二线三线| 三级亚洲高清视频| 美女av在线免费看| 日本欧美久久久久免费播放网| 久久国产欧美| 久久精品国产福利| 亚洲精品麻豆| 国产在线成人| 国产成人精品三级高清久久91 | 久久国产乱子精品免费女| 欧美日韩激情在线一区二区三区| 国产精品手机在线播放| 欧美日韩中文一区二区| 欧美影院三区| 激情久久久久久久| 成人在线视频区| 另类专区亚洲| 麻豆精品91| 欧美一级专区| 91精品一区二区三区综合在线爱| 蜜臀国产一区| 国产日韩视频在线| 亚洲一区二区成人| 久久高清精品| 国产精品不卡| 国产精品1区| 日韩国产91| 午夜欧美在线| 日韩欧美一区二区三区在线视频 | 丝袜美腿亚洲色图| 999精品色在线播放| 国产色播av在线| 欧美国产免费| 国产精品一区二区99| 亚洲精品动态| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩国产传媒| 亚洲五月婷婷| 久久国产中文字幕| 色婷婷色综合| 黄毛片在线观看| 四季av一区二区凹凸精品| 国产精品一国产精品k频道56| 天堂久久av| 日韩在线电影| 日韩激情一区二区| 日韩综合一区二区三区| 免费人成精品欧美精品| 国产视频一区在线观看一区免费| 影音先锋久久| 亚洲欧美日本国产专区一区| 欧美 日韩 国产精品免费观看| 日韩一区二区中文| 精品日韩视频| 日韩在线看片| 1000部精品久久久久久久久| 婷婷亚洲五月| 日韩中文字幕亚洲一区二区va在线| 在线视频精品| 亚洲日本免费电影| 日韩精品导航| 国产精品亚洲欧美| 国产日韩一区二区三区在线播放| 91麻豆精品激情在线观看最新| 日韩av一区二区三区四区| 97精品久久| 麻豆免费精品视频| 综合日韩av| 久久中文字幕二区| 亚洲精品中文字幕乱码| 亚洲免费中文| 日韩精品高清不卡| 国产精品igao视频网网址不卡日韩| 久久久久亚洲精品中文字幕| www.九色在线| 九九综合在线| 日韩中文字幕亚洲一区二区va在线| 亚洲区第一页| 欧美黄色一区二区| 成人自拍av| 亚洲一区成人| 国产精选久久| a日韩av网址| 欧美在线影院| 蜜桃视频一区二区三区在线观看| 日韩高清一区| 成人午夜毛片| 制服诱惑一区二区| 欧美日韩18| 超碰99在线| 91高清一区| 911精品国产| 中文字幕色婷婷在线视频| 夜夜嗨网站十八久久| 欧美日本一区| 日韩久久视频| 免费中文字幕日韩欧美| 欧美亚洲福利| 午夜精品成人av| 免费成人在线视频观看| 国产精品免费大片| 久久青草久久| 日韩av影院| 久久一区二区三区喷水| 日韩欧美久久| 综合日韩av| 一区二区精彩视频| 国产在线观看91一区二区三区| 激情综合网站| 久久精品97| 欧美日一区二区| 国产伦精品一区二区三区在线播放| 日韩欧美一区免费| 日韩精品视频在线看| 91亚洲人成网污www| 男女性色大片免费观看一区二区| 免费一区二区三区在线视频| 亚洲午夜黄色| 国产乱码精品| 亚洲欧美日韩视频二区| 免费在线观看一区| 国产精品毛片在线| 日韩av在线中文字幕| 亚洲精品系列| 亚洲精品在线影院| 欧美日本久久| 夜久久久久久| 一本大道色婷婷在线| 欧美亚洲人成在线| 黄色亚洲在线| a国产在线视频|