我现在正在用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
你需要从存储过程中返回值。 作为一般规则,我建议使用 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
在我看来很别扭(这也是我删除它的原因之一)。 如果你真的想处理错误,那么你就应该使用 TRY
CATCH
块。
.