[sql] 삽입 된 행의 ID를 얻는 가장 좋은 방법은 무엇입니까?


4 Answers

삽입 된 ID를 검색하는 가장 안전하고 정확한 방법은 출력 절을 사용하는 것입니다.

예를 들어 (다음 MSDN 기사에서 가져옴 )

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO
Question

삽입 된 행의 IDENTITY 를 가져 오는 가장 좋은 방법은 무엇입니까?

@@IDENTITYIDENT_CURRENTSCOPE_IDENTITY 에 대해 알고 있지만 각각에 첨부 된 장단점을 이해하지 못합니다.

누군가가 차이점을 설명해 주시겠습니까?




Entity Framework를 사용할 때 내부적으로 OUTPUT 기술을 사용하여 새로 삽입 된 ID 값을 반환합니다.

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

출력 결과는 임시 테이블 변수에 저장되고 다시 테이블에 조인되며 테이블에서 행 값을 반환합니다.

참고 : EF가 임시 테이블을 실제 테이블에 다시 결합시키는 이유는 무엇입니까 (두 상황이 일치하지 않는 경우).

그러나 그것이 EF가하는 일입니다.

이 기술 ( OUTPUT )은 SQL Server 2008 이상에서만 사용할 수 있습니다.




삽입 문 다음에이 문장을 추가해야합니다. 그리고 데이터가 삽입되고있는 테이블 이름을 확인하십시오. 삽입 문에 의해 현재 행이 영향을받은 현재 행은 없습니다.

IDENT_CURRENT('tableName')



새로 삽입 된 행의 ID를 얻는 가장 좋은 (가장 안전한 : 가장 안전한) 방법은 output 절을 사용하는 것입니다.

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)



MSDN

@@ IDENTITY, SCOPE_IDENTITY 및 IDENT_CURRENT는 테이블의 IDENTITY 열에 삽입 된 마지막 값을 반환한다는 점에서 유사한 기능입니다.

@@ IDENTITY 및 SCOPE_IDENTITY는 현재 세션의 테이블에서 생성 된 마지막 ID 값을 반환합니다. 그러나 SCOPE_IDENTITY는 현재 범위 내에서만 값을 반환합니다. @@ IDENTITY는 특정 범위에만 국한되지 않습니다.

IDENT_CURRENT는 범위와 세션에 의해 제한되지 않습니다. 지정된 테이블로 제한됩니다. IDENT_CURRENT는 세션 및 범위의 특정 테이블에 대해 생성 된 ID 값을 반환합니다. 자세한 내용은 IDENT_CURRENT를 참조하십시오.

  • IDENT_CURRENT 는 테이블을 인수로 취하는 함수입니다.
  • MSDN 는 테이블에 트리거가있을 때 혼란스러운 결과를 반환 할 수 있습니다.
  • SCOPE_IDENTITY 는 대부분 당신의 영웅입니다.



Related