2014-02-27 1 views
2

저장 프로 시저를 통해 동시에 두 테이블에 삽입하려고하지만 한 테이블에만 쓰고 다른 테이블에서는 실패합니다. 두 테이블저장 프로 시저를 통해 두 테이블에 삽입하지 못함

제 테이블[Employee]PK ID

번째 테이블[DatePics]FK Emp_ID

이이 명령을 실행 한 후 에러 메시지 간의 관계가

ALTER PROCEDURE [dbo].[insert_emp_pics] 
@EmpName nvarchar(100), 
@Nationality nvarchar(30), 
@PassportPic nvarchar(100), 
@Pic nvarchar(100) 
AS 
Begin 
set nocount on; 
DECLARE @ID int, 
@Emp_ID int 
insert into Employee (EmpName,Nationality) 
values (@EmpName,@Nationality) 
select @ID = @@IDENTITY 
insert into DatePics 
(PassportPic,Pic) 
values 
(@PassportPic ,@Pic) 
select @Emp_ID = @@IDENTITY 
end 

.

Cannot insert the value NULL into column 'Emp_ID', table 'QTecTest.dbo.DatePics'; 
column does not allow nulls. INSERT fails. 
+1

'Emp_ID' 열은 ID가 아닙니다. 따라서 SQL은 삽입 중에 값을 제공 할 것으로 기대합니다. –

답변

4

로 만들기 (두 테이블 ID 열이 가정) :

insert into Employee (EmpName,Nationality) 
values (@EmpName,@Nationality); 
set @EMP_ID = SCOPE_IDENTITY(); 
insert into DatePics (PassportPic,Pic, Emp_ID) 
values (@PassportPic ,@Pic, @EmpID); 
set @DatePicsID = SCOPE_IDENTITY(); 

또한 SCOPE_IDENTITY@@IDENTITY 이상으로 사용하십시오. @@Identity은 트리거가 새로운 (관련되지 않은) ID를 생성하는 문제에 취약합니다.

+0

Emp_id를 새 FK로 삽입 한 경우 내 C# 문을 작성하는 동안이를 선언해야합니다. Emp_ID는 자동 생성 된 양식 ID라고 가정합니다. [Emp_ID]에 자동 생성 된 [ID] 값을 저장 하시겠습니까? 감사합니다. –

+0

직원 레코드를 삽입하면 SQL에서 새 직원 ID PK를 만듭니다. 'SET @Emp_ID = SCOPE_IDENTITY();'는 새로 삽입 된'Employee.Emp_Id'를 잡고이를 사용하여'ForeignPar' 테이블에 종속 외부 키'Emp_ID'를 채 웁니다. 당신은'@ Emp_ID'와'@ DatePicsID'를 여러분의 C# 코드로 되돌릴 수 있습니다. PROC의 끝에서 그것들을'SELECT'하고 결과를'DataReader'와 묶거나, OUTPUT 매개 변수로 리턴합니다. – StuartLC

1

기본 키로 선언 된 열은 NULL 값을 가질 수 없습니다. 저장 프로 시저에서 Emp_ID 열에 값을 제공하지 않으므로 삽입이 실패합니다. 자동으로 삽입 할 경우 해당 열의 값은 당신이 DatePics에 외래 키로 새로운 Emp_Id을 삽입 할 필요도 IDENTITY

관련 문제