sql 마지막 - 삽입 된 행의 ID를 얻는 가장 좋은 방법은 무엇입니까?




인덱스 함수 (10)

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

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

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


Answers

항상 scope_identity ()를 사용합니다. 다른 어떤 것도 절대 필요하지 않습니다.


더하다

SELECT CAST(scope_identity() AS int);

삽입 SQL 문 끝으로

NewId = command.ExecuteScalar()

그것을 검색 할 것입니다.


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

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

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

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

산출

ID
2
3
4

새로 삽입 된 행의 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)

삽입 된 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

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

IDENT_CURRENT('tableName')

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

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

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


  • @@IDENTITY 는 모든 범위에서 현재 세션의 모든 테이블에 대해 생성 된 마지막 ID 값을 반환합니다. 스코프를 넘기 때문에 여기 에서 조심해야합니다 . 현재 명령문 대신 트리거에서 값을 얻을 수 있습니다.

  • SCOPE_IDENTITY() 는 현재 세션의 테이블과 현재 범위에 대해 생성 된 마지막 ID 값을 반환합니다. 일반적으로 당신이 사용하고자하는 것 .

  • IDENT_CURRENT('tableName') 는 모든 세션 및 범위의 특정 테이블에 대해 생성 된 마지막 ID 값을 반환합니다. 이것은 위의 두 가지가 당신이 필요로하는 것이 아닐 경우 ( 매우 드문 경우 )를 위해 값을 넣을 테이블을 지정할 수있게 해줍니다. 또한 @ Guy Starbuck 은 "레코드를 삽입하지 않은 테이블에 대해 현재 IDENTITY 값을 얻고 싶으면 이것을 사용할 수 있습니다."

  • INSERT 문의 OUTPUT 을 사용하면 해당 명령문을 통해 삽입 된 모든 행에 액세스 할 수 있습니다. 특정 구문으로 범위가 지정되었으므로 위의 다른 함수보다 더 간단 합니다. 그러나 테이블 변수 / 임시 테이블에 삽입 한 다음 쿼리해야하므로 좀 더 자세한 정보가 표시 되며 명령문이 롤백되는 오류 시나리오에서도 결과가 제공됩니다. 즉, 쿼리에서 병렬 실행 계획을 사용하는 경우 이는 ID를 가져 오는 유일한 보장 방법 입니다 (병렬 처리를 해제하는 것만 큼 ). 그러나 트리거 전에 실행되며 트리거 생성 값을 리턴하는 데 사용할 수 없습니다.


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

최종 결과를 보유 할 변수를 생성해야합니다.

가장 쉬운 솔루션

DECLARE @char VARCHAR(MAX);

SELECT @char = COALESCE(@char + ', ' + [column], [column]) 
FROM [table];

PRINT @char;




sql sql-server tsql