我正在为一个虚构的健身房创建一个模拟数据库。我有3个相关的表。Program, Workouts和Exercises(见下图)。每个 Program 包含一个或多个 Workouts,每个 Workout 包含一个或多个 Exercises。我试图创建一个存储过程来添加行到这三个表。我一直得到错误信息 "Error converting data type varchar to int."。我不明白为什么,因为变量的数据类型都与表中的数据类型相匹配(据我所知)。
CREATE TABLE [Program]
(
[ProgramID] INT IDENTITY(1,1),
[MemberNumber] INT,
[TrainerID] INT,
[ProgramStartDate] DATE,
[TrainerReviewDate] DATE,
[Active] CHAR(1),
PRIMARY KEY ([ProgramID]),
FOREIGN KEY ([MemberNumber])
REFERENCES [Members] ([MemberNumber])
ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY ([TrainerID])
REFERENCES [Trainers] ([TrainerID])
ON DELETE SET NULL ON UPDATE CASCADE
);
CREATE TABLE [Workouts]
(
[WorkoutID] INT IDENTITY(1,1),
[Description] VARCHAR(50),
[Day] VARCHAR(10),
[ProgramID] INT,
PRIMARY KEY ([WorkoutID]),
FOREIGN KEY ([ProgramID])
REFERENCES [Program] ([ProgramID])
ON DELETE SET NULL ON UPDATE CASCADE
);
CREATE TABLE [Exercise]
(
[ExerciseID] INT IDENTITY(1,1),
[ExerciseType] VARCHAR(30),
[Equipment] VARCHAR(30),
[Sets] INT,
[Reps] INT,
[WorkoutID] INT,
PRIMARY KEY ([ExerciseID]),
FOREIGN KEY ([WorkoutID])
REFERENCES [Workouts] ([WorkoutID])
ON DELETE SET NULL ON UPDATE CASCADE
)
/*Description: This stored procedure adds a new program with workout/exercise details. */
CREATE PROCEDURE usp_New_Program_4 (
@MemberNumber int,
@TrainerID int,
@ProgramStartDate date,
@TrainerReviewDate date,
@Active char(1),
@Description varchar(50),
@Day varchar(10),
@ProgramID int = SCOPE_IDENTITY,
@ExerciseType_1 varchar(30),
@Equipment_1 varchar(30),
@Sets_1 int,
@Reps_1 int,
@ExerciseType_2 varchar(30),
@Equipment_2 varchar(30),
@Sets_2 int,
@Reps_2 int,
@ExerciseType_3 varchar(30),
@Equipment_3 varchar(30),
@Sets_3 int,
@Reps_3 int,
@ExerciseType_4 varchar(30),
@Equipment_4 varchar(30),
@Sets_4 int,
@Reps_4 int,
@WorkoutID int = SCOPE_IDENTITY
)
AS
SET xact_abort ON
BEGIN
INSERT INTO Program (MemberNumber, TrainerID, ProgramStartDate, TrainerReviewDate, Active)
VALUES (@MemberNumber, @TrainerID, @ProgramStartDate, @TrainerReviewDate, @Active);
INSERT INTO Workouts (Description, Day, ProgramID)
VALUES (@Description, @Day, SCOPE_IDENTITY());
INSERT INTO Exercise (ExerciseType, Equipment, Sets, Reps, WorkoutID)
VALUES (@ExerciseType_1, @Equipment_1, @Sets_1, @Reps_1, SCOPE_IDENTITY()),
(@ExerciseType_2, @Equipment_2, @Sets_2, @Reps_2, SCOPE_IDENTITY()),
(@ExerciseType_3, @Equipment_3, @Sets_3, @Reps_3, SCOPE_IDENTITY()),
(@ExerciseType_4, @Equipment_4, @Sets_4, @Reps_4, SCOPE_IDENTITY())
END;
GO
/*Test for usp_New_Program_4
Result: Failed - Error converting data type varchar to int*/
Exec usp_New_Program_4 21,3,'2020-06-06','2020-07-07','Y','Chest & Arms',SCOPE_IDENTITY,'Bench
Press','50kg Barbell',3,6,'Press Ups','Floor Mat',3,15,'Bicep Curls','15kg
Dumbells',3,6,'Tricep Extensions','15kg Dumbells',3,6,SCOPE_IDENTITY
Go
基本的调试是检查你的参数...... 如果我们这样做...
Exec usp_New_Program_4 21, --@MemberNumber int
3, --@TrainerID int
'2020-06-06', --@ProgramStartDate date
'2020-07-07', --@TrainerReviewDate date
'Y', --@Active char(1)
'Chest & Arms', --@Description varchar(50)
SCOPE_IDENTITY, --@Day varchar(10)
'Bench
Press', --@ProgramID int
'50kg Barbell', --@ExerciseType_1 varchar(30)
3, --@Equipment_1 varchar(30)
6, --@Sets_1 int
'Press Ups', --@Reps_1 int
'Floor Mat', --@ExerciseType_2 varchar(30)
3, --@Equipment_2 varchar(30)
15, --@Sets_2 int
'Bicep Curls', --@Reps_2 int
'15kg
Dumbells', --@ExerciseType_3 varchar(30)
3, --@Equipment_3 varchar(30)
6, --@Sets_3 int
'Tricep Extensions', --@Reps_3 int
'15kg Dumbells', --@ExerciseType_4 varchar(30)
3, --@Equipment_4 varchar(30)
6, --@Sets_4 int
SCOPE_IDENTITY --@Reps_4 int
现在很清楚了。该值 'Bench
Press'
并非 int
. 也不是 'Press Ups'
, 'Bicep Curls'
或 'Tricep Extensions'
.
这就是为什么使用格式为 EXEC PROC {Proc Name} @{Parameter Name} = {Parameter Value}
对于任何有超过1个或2个参数的程序来说都是非常重要的;你不会犯简单的错误,比如漏掉一个参数。
在本例中,你显然漏掉了一个关于 @Day
(因为我认为你想通过 SCOPE_IDENTITY
对于 @ProgramID
),因此你后面的参数都是错误的。但SP仍然运行正常,因为你的最后一个参数(@WorkoutID
)有一个默认值,所以没有 "介意 "被省略。