首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 存儲過程嵌套調用示例:企業與產品兩表聯動邏輯

     編輯:關於SqlServer

存儲過程嵌套(巢狀調用)是封裝業務邏輯、實現事務原子性的常用模式。示例展示企業信息表與產品表的主從級聯操作。

表結構

  • 企業表 prd_wxt_enterprise_tbl_EnterpriseInfo:EnterpriseId (PK, CHAR(10))、EnterpriseName、ShortName、Address、E_System
  • 產品表 Shop_tbl_ProductInfo:P_Code (PK, CHAR(10))、EnterpriseId (FK)、P_Name、P_Price、P_UserPrice、Remark

嵌套調用模式

CREATE PROCEDURE dbo.CreateEnterpriseWithProducts
  @EnterpriseId CHAR(10),
  @EnterpriseName VARCHAR(200),
  @ProductList ProductType READONLY  -- TVP 或 XML
AS
BEGIN
  BEGIN TRY
    BEGIN TRANSACTION
      -- 1. 外層:創建企業
      INSERT INTO prd_wxt_enterprise_tbl_EnterpriseInfo
      VALUES (@EnterpriseId, @EnterpriseName, ...)
      
      -- 2. 內層:批量創建產品(調用子存儲過程或直接 INSERT)
      INSERT INTO Shop_tbl_ProductInfo (P_Code, EnterpriseId, P_Name, ...)
      SELECT P_Code, @EnterpriseId, P_Name, ... FROM @ProductList
      
    COMMIT TRANSACTION
  END TRY
  BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
    THROW  -- SQL 2012+;舊版用 RAISERROR
  END CATCH
END

嵌套層級限制與事務傳播

  • 最大嵌套 32 級(@@NESTLEVEL 監控)
  • 內層錯誤自動回滾外層事務(除非用 SAVE TRANSACTION 部分回滾)
  • @@TRANCOUNT 計數器:每 BEGIN TRAN +1,COMMIT -1,歸零時真正提交

最佳實踐

  1. 外層統一開啟事務,內層不再 BEGIN TRAN
  2. 錯誤處理集中在最外層 TRY/CATCH
  3. 大批量內層操作考慮 BULK INSERT / Table-Valued Parameter
  4. 避免過深嵌套(>5 層),改用模塊化設計
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved