亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:231日期:2023-03-06 14:25:15
目錄
  • 如何在 SQL Server 中使用 Try Catch 處理錯(cuò)誤?
  • 示例:了解 SQL Server 中的 Try-Catch 實(shí)現(xiàn)。
  • 在 SQL Server 中使用 try-catch 的示例

如何在 SQL Server 中使用 Try Catch 處理錯(cuò)誤?

從 SQL Server 2005 開始,我們在TRY 和 CATCH塊的幫助下提供了結(jié)構(gòu)錯(cuò)誤處理機(jī)制。使用TRY-CATCH的語法如下所示。

BEGIN TRY
--這里寫可能導(dǎo)致錯(cuò)誤的語句
END TRY
BEGIN CATCH
--當(dāng)錯(cuò)誤發(fā)生后,這里的語句將會(huì)被執(zhí)行
END CATCH
-- 其他語句

有可能拋出異常的SQL 語句需要放在BEGIN TRY和END TRY塊之間。如果在 TRY 塊中發(fā)生異常,則控制權(quán)立即轉(zhuǎn)移到相應(yīng)的CATCH塊。如果 TRY 塊中沒有發(fā)生異常,則直接跳過CATCH塊,執(zhí)行CATCH塊之后的語句。

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

示例:了解 SQL Server 中的 Try-Catch 實(shí)現(xiàn)。

在下面的示例中,我們使用 SQL Server TRY CATCH 實(shí)現(xiàn)和用戶定義的錯(cuò)誤語句來創(chuàng)建一個(gè)用于除以 2 個(gè)變量值的存儲(chǔ)過程。

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 "結(jié)果是: " + CAST(@Result AS VARCHAR)
  END TRY
  BEGIN CATCH
    PRINT "第二個(gè)數(shù)字不能為0"
  END CATCH
END

讓我們來測試一下這個(gè)存儲(chǔ)過程

exec spDivideTwoNumbers 100,1

輸出: 結(jié)果是: 100

exec spDivideTwoNumbers 100,0

輸出: 第二個(gè)數(shù)字不能為0

當(dāng)我們用正確的值執(zhí)行上述存儲(chǔ)過程時(shí),程序就不會(huì)出現(xiàn)錯(cuò)誤。這意味著在執(zhí)行完 try 塊中的所有語句后,控件直接跳轉(zhuǎn)到存在于 catch 塊之后的語句,而不執(zhí)行 catch 塊。

如果在執(zhí)行過程中,即在try塊中發(fā)生任何錯(cuò)誤,那么在這種情況下,從發(fā)生錯(cuò)誤的行開始,控制權(quán)直接跳轉(zhuǎn)到catch塊。所以 try 塊中的其余語句將不會(huì)執(zhí)行,而 catch 塊將執(zhí)行。

注意:在上面的程序中,當(dāng)錯(cuò)誤發(fā)生時(shí),我們會(huì)顯示一條用戶自定義的錯(cuò)誤消息“第二個(gè)數(shù)字不能為0”。然而,我們還可以通過調(diào)用函數(shù) Error_Message 來顯示原始錯(cuò)誤消息。為了測試這個(gè)重寫catch塊內(nèi)的代碼如下

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

再次執(zhí)行: exec spDivideTwoNumbers 100,0
輸出: 遇到以零作除數(shù)錯(cuò)誤。

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

我們將使用下面的 Product 和 ProductSales 表來了解如何使用 RaiseError 和 @ERROR 系統(tǒng)定義函數(shù)來處理 SQL Server 中的錯(cuò)誤。

Product (產(chǎn)品表)

ProductIDNamePriceQuantity101Laptop15000100102Desktop20000150104Mobile3000200105Tablet4000250

ProductSales (產(chǎn)品銷售表)

ProductSalesIDProductIDQuantitySold110110210215310430410535

請使用以下 SQL 腳本創(chuàng)建并使用示例數(shù)據(jù)填充 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 實(shí)現(xiàn)產(chǎn)品銷售的存儲(chǔ)過程

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

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

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

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

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

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

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

      -- 最后,提交事務(wù)
      COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
      -- 如果發(fā)生了異常,回滾事務(wù)
      ROLLBACK TRANSACTION
      -- 輸出錯(cuò)誤詳情
      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

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

如果在 try 塊中發(fā)生錯(cuò)誤,則立即跳轉(zhuǎn)到 CATCH 塊,并且在 CATCH 塊中,我們正在回滾事務(wù)。因此,使用 Try/Catch 構(gòu)造處理錯(cuò)誤比使用 SQL Server 中的 @@Error 系統(tǒng)函數(shù)要容易得多。

SQL Server 還提供了一些我們可以在 CATCH 塊范圍內(nèi)使用的內(nèi)置函數(shù),這些函數(shù)用于檢索有關(guān)發(fā)生的錯(cuò)誤的更多信息,如果這些函數(shù)在 CATCH 塊范圍之外執(zhí)行,它們將返回 NULL。

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

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

標(biāo)簽: MsSQL
主站蜘蛛池模板: 中国帅小伙肌肉gaysextube | 成人午夜视频在线 | 日韩视频免费在线观看 | 黑巨茎大战中国美女 | 亚洲女视频 | 视频一区二区在线观看 | 国产又黄又潮娇喘视频免费 | 亚洲国产一区在线二区三区 | 欧美专区一区二区三区 | 免费看黄色a级片 | 日韩大片在线观看 | 日韩欧美一区二区三区免费观看 | 国产精品秋霞午夜 | 国产91精品黄网在线观看 | 国产精品自在线拍国产 | 亚洲特级黄色片 | 亚洲国产高清视频 | 国产免费区 | 亚洲欧美日韩高清 | 国产免费网址 | 日本亚洲国产精品久久 | 国产啪在线 | 欧美日韩国产亚洲一区二区 | 一集毛片 | 国产日韩欧美亚洲青青草原 | 亚洲欧美一区二区久久 | 久久青青草原国产精品免费 | 手机在线观看黄色网址 | 久久国产热视频 | 国产精品日韩高清在线蜜芽 | 国产永久免费视频m3u8 | 在线看污片 | 国产最新地址 | 看毛片软件| 亚洲国产精品久久人人爱 | 在线观看成年美女黄网色视频 | 亚洲国产日韩无在线播放 | www.91在线播放 | 福利片视频区 | 亚洲欧美精品一区天堂久久 | 亚洲 欧美 中文 日韩专区 |