Member 14024377 Ответов: 2

Имя столбца или количество предоставленных значений не соответствует определению таблицы.


StudentTable
CREATE TABLE [Student].[StudentDetails](
	[StudentId] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](35) NULL,
	[IDNo] [varchar](10) NULL,
	[NameofGuardian] [varchar](50) NULL,
	[AddressofCommunication] [varchar](200) NULL,
	[MobileNumber] [varchar](50) NULL,
	[LandlineNumber] [varchar](20) NULL,
	[Email] [varchar](50) NULL,
	[AdmissionYear] [varchar](20) NULL,
	[SectionID] [int] NULL,
	[ClassID] [int] NULL,
	[IsActive] [bit] NULL,
	[IsDeleted] [bit] NULL,
	[CreatedBy] [int] NULL,
	[CreationDate] [datetime] NULL,
	[ModifiedBy] [int] NULL,
	[ModifiedDate] [datetime] NULL
) 


ОПРЕДЕЛЯЕМЫЙ ПОЛЬЗОВАТЕЛЕМ ТИП ТАБЛИЦЫ
CREATE TYPE [Student].[InsertBulkType] AS TABLE(
	[Name] [varchar](35) NULL,
	[IDNo] [varchar](10) NULL,
	[NameofGuardian] [varchar](50) NULL,
	[AddressofCommunication] [varchar](200) NULL,
	[MobileNumber] [varchar](50) NULL,
	[LandlineNumber] [varchar](20) NULL,
	[Email] [varchar](50) NULL,
	[AdmissionYear] [varchar](20) NULL,
	[SectionID] [int] NULL,
	[ClassID] [int] NULL
)


когда я создаю процедуру для массовой вставки ниже пришла ошибка
это моя процедура
Create PROCEDURE [Student].[InsertBulkStudent]
      @tblStudent InsertBulkType READONLY
	 
	
AS
BEGIN

 INSERT INTO StudentDetails
      SELECT Name,IDNo,NameofGuardian,AddressofCommunication,MobileNumber,LandlineNumber,
	  Email,AdmissionYear,SectionID,ClassID
      FROM @tblStudent
  
end


ошибка есть
Msg 213, Level 16, State 1, Procedure InsertBulkStudent, Line 9
Column name or number of supplied values does not match table definition.


Что я уже пробовал:

Msg 213, Level 16, State 1, Procedure InsertBulkStudent, Line 9
Column name or number of supplied values does not match table definition.

2 Ответов

Рейтинг:
6

OriginalGriff

Ваша таблица содержит первый столбец, который вы не можете - и не можете - указать: столбец StudentID. Вы не можете указать его, потому что это столбец идентификаторов, но если вы не перечисляете столбцы для вставки, то SQL всегда начинается с первого и переходит туда. Нет команды "пропустить столбец", поэтому вам нужно указать имена столбцов, в которые вы хотите ввести данные. Вы действительно должны сделать это в любом случае, это хорошая практика!

Create PROCEDURE [InsertBulkStudent]
      @tblStudent InsertBulkType READONLY
	 
	
AS
BEGIN

 INSERT INTO StudentDetails (Name,IDNo,NameofGuardian,AddressofCommunication,MobileNumber,LandlineNumber,
	  Email,AdmissionYear,SectionID,ClassID) 
      SELECT Name,IDNo,NameofGuardian,AddressofCommunication,MobileNumber,LandlineNumber,
	  Email,AdmissionYear,SectionID,ClassID
      FROM @tblStudent
  
end


Member 14024377

@OriginalGriff
Большое спасибо!

OriginalGriff

Всегда пожалуйста!

Рейтинг:
2

Ehsan Sajjad

Поскольку фактическое количество столбцов в таблице базы данных и пользовательской таблице различается по номерам, вам нужно будет явно указать столбцы таблицы БД в операторе INSERT следующим образом:

INSERT INTO StudentDetails(Name,IDNo,NameofGuardian,AddressofCommunication,MobileNumber,
              LandlineNumber,Email,AdmissionYear,SectionID,ClassID)
     SELECT Name,IDNo,NameofGuardian,AddressofCommunication,MobileNumber,
            LandlineNumber,Email,AdmissionYear,SectionID,ClassID
     FROM @tblStuden