为什么我得到 "Error converting data type varchar to int."(将数据类型varchar转换为int的错误)。

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

我正在为一个虚构的健身房创建一个模拟数据库。我有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
sql sql-server
2个回答
1
投票

看起来你可能在执行存储过程的行中漏掉了一个字段。我迅速将存储过程的输入值复制到电子表格中,然后是你的测试行中抛出错误的值。看看吧,看起来你可能漏掉了Day这个值?输入后,它应该会正确地排列一切。我在第一行做了标记,快速浏览后,看起来是它导致了错误(其他较低的也会,直到缺失的值被修复)。

enter image description here


0
投票

基本的调试是检查你的参数...... 如果我们这样做...

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)有一个默认值,所以没有 "介意 "被省略。

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