sql-server mssql identity - 삽입 된 행의 ID를 얻는 가장 좋은 방법은 무엇입니까?





5 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
함수 시퀀스 insert

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

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

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




새로 삽입 된 행의 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 는 대부분 당신의 영웅입니다.



@@ IDENTITY 는 현재 SQL 연결을 사용하여 삽입 된 마지막 ID입니다. 이것은 새 레코드에 대해 ID를 삽입하기 만하면되는 삽입 저장 프로 시저에서 리턴 할 수있는 좋은 값이며 이후에 추가 된 행이 더 많은지 신경 쓰지 않아도됩니다.

SCOPE_IDENTITY 는 현재 SQL 연결을 사용하여 삽입 된 마지막 ID이며 현재 범위에서 - 삽입 후 트리거를 기반으로 삽입 된 두 번째 IDENTITY가 있으면 SCOPE_IDENTITY에 반영되지 않고 수행 한 삽입 만 반영됩니다 . 솔직히, 나는 이것을 사용한 이유가 한번도 없다.

IDENT_CURRENT (tablename) 는 연결이나 범위에 관계없이 마지막으로 삽입 된 ID입니다. 레코드를 삽입하지 않은 테이블에 대해 현재 IDENTITY 값을 가져 오려면이 옵션을 사용할 수 있습니다.




다른 버전의 SQL Server에 대해서는 말할 수 없지만 2012 년에는 직접 출력해도 좋습니다. 임시 테이블을 신경 쓰지 않아도됩니다.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)

그건 그렇고,이 기술은 또한 여러 행을 삽입 할 때 작동합니다.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
    (...),
    (...),
    (...)

산출

ID
2
3
4



Related