电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:241日期: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
主站蜘蛛池模板: 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 五轴加工中心_数控加工中心_铝型材加工中心-罗威斯 | 挨踢网-大家的导航!| 空调风机,低噪声离心式通风机,不锈钢防爆风机,前倾皮带传动风机,后倾空调风机-山东捷风风机有限公司 | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | ge超声波测厚仪-电动涂膜机-电动划格仪-上海洪富 | 深圳市万色印象美业有限公司| MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 空心明胶胶囊|植物胶囊|清真胶囊|浙江绿键胶囊有限公司欢迎您! | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 商秀—企业短视频代运营_抖音企业号托管| 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 深圳市源和塑胶电子有限公司-首页 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 首页_中夏易经起名网| 成都办公室装修-办公室设计-写字楼装修设计-厂房装修-四川和信建筑装饰工程有限公司 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 |