当使用存储过程向多个表添加行时,如何检索自动生成的ID值?

问题描述 投票:0回答:1

我现在正在用SQL Server进行一个健身房的数据库设计(以下链接中的ERD。https:/1drv.msus!ApYj_1gaRPZGgnjOj6VC_HgeaenU。).

作为其中的一部分,我需要能够通过一个存储过程来创建一个新的成员和他们的第一个程序。我所面临的问题是,为了创建一个新的程序,我首先需要会员号,当一条记录被添加到会员表中时,会自动生成会员号,而为了创建一个新的会员,我需要有一个支付ID,当一条记录被添加到支付表中时,会自动生成支付ID。

如何在一个存储过程中检索自动生成的身份值呢,也就是说,目前我看到的唯一方法是先创建一个存储过程在支付表中创建一条记录,然后手动查找PaymentID值,然后在一个单独的存储过程中使用这个值在成员表中插入一条记录(同样再设置一个新的程序)。

请看下面我目前有3个独立的存储过程来实现这个功能,任何帮助都将是非常感激的。

CREATE PROCEDURE NewPayment
    @PaymentType varchar(10),
    @LastPaymentDate date,
    @AmountPaid varchar(15),
    @NextPaymentDate date,
    @AmountDue varchar(15)
AS
    INSERT INTO Payment 
    VALUES (@PaymentType, @LastPaymentDate, @AmountPaid, @NextPaymentDate, @AmountDue);

    IF @@ERROR <> 0 
       RETURN -1 
    ELSE 
       RETURN 0
GO

CREATE PROCEDURE NewMember
    @Name varchar(100),
    @Address varchar(200),
    @ContactNo varchar(15),
    @Email varchar(50),
    @Photo image,
    @PaymentID int,
    @GDPRQ1 char(1),
    @GDPRQ2 char(1),
    @IsDeleted char(1)
AS
    INSERT INTO Members 
    VALUES (@Name, @Address, @ContactNo, @Email, @Photo, @PaymentID, @GDPRQ1, @GDPRQ2, @IsDeleted);

    IF @@ERROR <> 0 
       RETURN -1 
    ELSE 
       RETURN 0
GO

CREATE PROCEDURE NewProgram
    @MemberNumber int,
    @TrainerID int,
    @ProgramStartDate date,
    @TrainerReviewDate date,
    @Active char(1)
AS
    INSERT INTO Program 
    VALUES (@MemberNumber, @TrainerID, @ProgramStartDate, @TrainerReviewDate, @Active);


  [1]: https://i.stack.imgur.com/ERuFS.png
sql sql-server
1个回答
1
投票

你需要从存储过程中返回值。 作为一般规则,我建议使用 output 子句来解决这个问题。

create proc NewMember (
    @Name varchar(100),
    @Address varchar(200),
    @ContactNo varchar(15),
    @Email varchar(50),
    @Photo image,
    @PaymentID int,
    @GDPRQ1 char(1),
    @GDPRQ2 char(1),
    @IsDeleted char(1),
    @MemberId_out int output
) As
begin
    declare table @id (memberid int)
    Insert into Members
        output inserted.memberid into @id
        values (@Name, @Address, @ContactNo ,@Email, @Photo, @PaymentID, @GDPRQ1,@GDPRQ2, @IsDeleted);

    select @MemberId_out = memberid from @id;

    return 0
end;

使用 @@ERROR 在我看来很别扭(这也是我删除它的原因之一)。 如果你真的想处理错误,那么你就应该使用 TRYCATCH 块。

.

© www.soinside.com 2019 - 2024. All rights reserved.