【问题标题】:Error Msg 213: Column name or number of supplied values does not match table definition错误消息 213:列名或提供的值的数量与表定义不匹配
【发布时间】:2014-06-14 19:06:31
【问题描述】:

我创建了一个带有存储过程的表,并尝试将数据插入其中,但出现此错误

消息 137,第 15 级,状态 2,第 49 行
必须声明标量变量“@EmployeeID”)

请帮忙!

Create Table Humanresource.Employee
(
    EmployeeID char(3) constraint pkemployeeid primary key,
    FirstName varchar(20) not null,
    LastName varchar(20) not null,
    Emp_Address varchar(30) not null,
    Title char(30) constraint ckTitle check(Title in ('Executive','Senior Executive','Management Trainee','Event Manager','Senior Event Manager')),
    Phone varchar(20) check(Phone like '[0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9]')
)

存储过程:

create procedure Auto_EmpID
    @FirstName varchar(20),
    @LastName varchar(20),
    @Address varchar(30),
    @Title varchar(30),
    @Phone varchar(20)
AS
   Declare @EmployeeID char(3)

   if exists (select EmployeeID From HumanResource.Employee Where EmployeeID = 'E101')
   BEGIN
      Select 
         @EmployeeID = Max(right(EmployeeID, 2))
      from HumanResource.Employee

      Select 
         @EmployeeID = CASE
                         When @EmployeeID >= 0 AND @Employeeid < 9 
                           Then 'E0' + convert(char(3), @EmployeeID + 1)
                         When @EmployeeID >= 9 AND @EmployeeID < 99  
                           Then 'E' + convert(char(3), @EmployeeID + 1)
                       END
    END
    Else
       set @Employeeid = 'E101'


    insert into HumanResource.Employee
    Values(@EmployeeID, @FirstName, @LastName, @Address, @Title, @Phone)

    Return 

    Exec Auto_EmpID 'Bamidele','Ajose','Lagos','11-1111-111-111'
    exec Auto_Empid 'Kunle','Awele','Ikeja','22-3332-655-897'
    exec auto_empid 'John','George','Benin','33-5555-7654-443'

    select * from humanresource.employee

    insert into humanresource.employee(@EmployeeID, @FirstName, @LastName, @Address, @Title, @Phone)
    values(@EmployeeID = 'e101', 'Baley', 'Carles', 'Los Angeles', '23-3445-434-344')

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    这两行有很多问题:

    insert into humanresource.employee(@EmployeeID,@FirstName,@LastName,@Address,@Title,@Phone)
    values(@EmployeeID='e101','Baley','Carles','Los Angeles','23-3445-434-344')
    
    1. 您不需要在列名前加上 @ 符号。这只能与变量一起使用。
    2. 列列表包含 6 列,但您在 values 子句中仅提供 5 个值。请添加第 6 个值或删除您不想插入的列。
    3. 如果你想使用值'e101',你可以直接插入。如果你想使用变量@employeeID,只需传递它。 values 子句中的赋值 @employeeID = 'e101' 是错误的。您可以在 insert 语句之前执行 set @employeeID = 'e101 来分配值。
    4. @employeeID 被声明为char(3),因此即使您想在insert statement 之前为其分配值“e101”,该值也会被截断为“e10”。因此,您必须至少将其声明为 char(4)

    另一件事是你的存储过程需要5个输入参数,但你在调用它时只传递了4个。如果您只想传递一些参数而不是全部,则需要在创建过程时为每个参数指定默认值,如下所示:

    create procedure Auto_EmpID
    @FirstName varchar(20) = 'somefirstname',
    @LastName varchar(20) = 'somelastname',
    @Address varchar(30) = 'somecity',
    @Title varchar(30) = 'sometitle',
    @Phone varchar(20) = '111-111-111'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2021-05-23
      • 2015-10-20
      • 2022-09-28
      • 2020-11-30
      相关资源
      最近更新 更多