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
相关产品推荐
相关产品推荐

