You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Adventure Works 2019:如何将新增人员的3个存储过程合并为单个

单存储过程实现人员新增全流程方案

你可以将三步操作整合到同一个存储过程中,利用表变量承接插入BusinessEntity后返回的自增BusinessEntityID,直接复用该值插入Person表,无需额外查询或拆分存储过程。

完整的存储过程代码如下:

CREATE PROCEDURE Person.CreatePersonFull
    -- 传入参数和你原有C#端传入的参数保持一致即可,类型匹配AdventureWorks2019表结构定义
    @RowGUID UNIQUEIDENTIFIER,
    @PersonType NCHAR(2),
    @NameStyle BIT,
    @Title NVARCHAR(8),
    @FirstName NVARCHAR(50),
    @MiddleName NVARCHAR(50),
    @LastName NVARCHAR(50),
    @Suffix NVARCHAR(10),
    @EmailPromotion INT,
    @AdditionalContactInfo XML,
    @Demographics XML
AS
BEGIN
    SET NOCOUNT ON; -- 避免返回多余的影响行数信息,适配原有C#调用逻辑

    -- 声明表变量存储插入后返回的BusinessEntityID
    DECLARE @InsertedBusinessEntity TABLE (BusinessEntityID INT);

    -- 第一步:插入BusinessEntity表,同时返回生成的BusinessEntityID到表变量
    INSERT INTO Person.BusinessEntity (rowguid, ModifiedDate)
    OUTPUT inserted.BusinessEntityID INTO @InsertedBusinessEntity(BusinessEntityID)
    VALUES (@RowGUID, GETDATE());

    -- 第二步:直接从表变量取ID插入Person表
    INSERT INTO Person.Person (
        BusinessEntityID, PersonType, NameStyle, Title, FirstName, MiddleName, LastName,
        Suffix, EmailPromotion, AdditionalContactInfo, Demographics, rowguid, ModifiedDate
    )
    SELECT 
        BusinessEntityID, 
        @PersonType, 
        @NameStyle, 
        @Title, 
        @FirstName, 
        @MiddleName, 
        @LastName,
        @Suffix,
        @EmailPromotion,
        @AdditionalContactInfo,
        @Demographics,
        @RowGUID,
        GETDATE()
    FROM @InsertedBusinessEntity;
END
GO

方案优势:

  • 全程仅需调用一次存储过程,C#端无需多次发起数据库交互,仅需传入全量人员参数即可
  • 用OUTPUT子句直接获取自增ID,省去额外查询步骤,性能更高,也避免了高并发场景下用GUID查询可能出现的取值偏差
  • 所有操作处于同一个存储过程的事务上下文中,数据一致性更强,若某一步出错会整体回滚,不会出现BusinessEntity插入成功但Person插入失败的脏数据

内容的提问来源于stack exchange,提问作者Trypsin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:09:00