2016-11-09 9 views
1

SQL Server 저장 프로 시저에서 계단식 삽입을 수행하고 있습니다. 그런 다음 첫 번째 표 삽입의 ID에서 SCOPE_IDENTITY을 두 번째 표로 전달합니다. 계단식 삽입에서 null Scope_Indentity를 해결하는 방법은 무엇입니까?

하지만이 SCOPE_IDENTITY에 대한 NULL 값을 얻을 저장 프로 시저를 실행하는 동안

:
이 컬럼에 NULL 값을 삽입 할 수 없습니다

메시지 515, 수준 16, 상태 2, 프로 시저 InsertDDM_UserProfile, 라인 43 '필터 ', 테이블'..... dbo.DDM_Dashboard '; 열이 널을 허용하지 않습니다. INSERT가 실패합니다.

질문 : 왜 저장 프로 시저가 SCOPE_IDENTITY를 사용하여 널 ID를 반환합니까?

이것은 초안을 작성한 저장 프로 시저입니다.

ALTER PROCEDURE [dbo].[InsertDDM_UserProfile] 
    @p_email VARCHAR(100), 
    @p_dashboardName VARCHAR(100), 
AS 
BEGIN  
    INSERT INTO [dbo].[DDM_User] ([Email]) 
    VALUES (@p_email) 

    INSERT INTO [dbo].[DDM_Dashboard] ([Dashboard_Name], [DDM_USER_ID]) 
    VALUES (@p_dashboardName, SCOPE_IDENTITY()) 
END 

을 그리고 아래의 두 테이블의 구조입니다 : FK 제약이 이미 테이블에 설정 한

DDM_User-

CREATE TABLE [dbo].[DDM_User] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Email] [varchar](80) NOT NULL, 

    CONSTRAINT [PK_DDMUser] 
     PRIMARY KEY CLUSTERED ([ID] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

DDM_Dashboard가 :

CREATE TABLE [dbo].[DDM_Dashboard] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Dashboard_Name] [varchar](100) NOT NULL, 
    [DDM_USER_ID] [int] NOT NULL, 

    CONSTRAINT [PK_DDMDashboard] 
     PRIMARY KEY CLUSTERED ([ID] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[DDM_Dashboard] WITH NOCHECK 
    ADD CONSTRAINT [FK_DDMDashboard_DDMUser] 
     FOREIGN KEY([DDM_USER_ID]) REFERENCES [dbo].[DDM_User] ([ID]) 
GO 

ALTER TABLE [dbo].[DDM_Dashboard] CHECK CONSTRAINT [FK_DDMDashboard_DDMUser] 
GO 
+1

두 테이블의 테이블 스키마를 볼 수 있습니까? DDM_Dashboard의 필터 열은 Null을 허용하지 않으며 삽입 문에 없습니다. –

+0

물론 게시하겠습니다. –

답변

2

이됩니다 두 번째 삽입시 SCOPE_IDENTITY()과 관련이 없습니다.

INSERT INTO [dbo].[DDM_Dashboard] ([Dashboard_Name], [DDM_USER_ID]) 
VALUES (@p_dashboardName, SCOPE_IDENTITY()) 

두 개의 열 [Dashboard_Name][DDM_USER_ID]에만 삽입됩니다. 오류 메시지에서 널 값을 허용하지 않는 열 [Filter]에 대한 값을 지정하지 않으므로 삽입이 실패합니다.

+0

흠 ... 답변으로 받아 들였지만 테이블 스키마에'[Filter]'컬럼이 보이지 않습니다. –

+0

예 필터 열이 실제로 테이블에 남아 있습니다. 이 컬럼의 이전 드롭은이 고스트 컬럼이 여전히 테이블 스키마에 있음을 의미하지는 않습니다. –

1
DECLARE @Value1 varchar(50) = 'Test1', @Value2 varchar(50) = 'Test2'; 

DECLARE @Table1 table (Id int NOT NULL IDENTITY(1,1), Value varchar(50) NOT NULL); 
DECLARE @Table2 table (Id int NOT NULL, Value varchar(50) NOT NULL); 

INSERT INTO @Table1 (Value1) 
OUTPUT inserted.Id, @Value2 INTO @Table2 (Id, Value) 
Values (@Value1) 
; 

SELECT * FROM @Table1; 
SELECT * FROM @Table1; 

편집 : GarethD 지적 ,이 때문에 외래 키 제약에 실제로 문제에 대한 올바른 해결책이 아니다. 그러나 다른 시나리오에서는 계단식 삽입 및 업데이트를 처리하는 데 유용한 두 가지 레코드의 원자 적 연산이므로 유용합니다.

+1

약간의 설명이 도움이 될 것입니다. 불행히도이 경우 외래 키 관계로 인해 'OUTPUT' 절을 사용하여 두 번째 테이블에 직접 삽입 할 수 없으며 단 하나의 행을 삽입하면 더 복잡한 일이 될 것입니다. 'SCOPE_IDENTITY()'대신에 임시 테이블과 함께'OUTPUT'을 사용하십시오. 외래 키가 없거나 여러 행을 삽입하면 이것이 앞으로 나아갈 길입니다. – GarethD

+0

우수 포인트, 제약 조건을 잊어 버렸습니다. – Russ