IT TIP

@@ IDENTITY, SCOPE_IDENTITY (), OUTPUT 및 기타 마지막 ID 검색 방법

itqueen 2020. 12. 15. 20:39
반응형

@@ IDENTITY, SCOPE_IDENTITY (), OUTPUT 및 기타 마지막 ID 검색 방법


삽입 후 기본 키 ID 필드의 값을 검색 할 때 사용되는 다양한 방법을 보았습니다.

declare @t table (
    id int identity primary key,
    somecol datetime default getdate()
)
insert into @t
default values

select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1

삽입 후 ID 테이블 반환 :

Create Table #Testing (  
    id int identity,  
    somedate datetime default getdate()  
)  
insert into #Testing  
output inserted.*  
default values   

어떤 방법이 적절하거나 더 낫습니까? OUTPUT 메서드는 범위에 안전합니까?

두 번째 코드 스 니펫은 SQL in the Wild


무엇을 하려는지에 따라 다릅니다.

@@정체

값을 생성 한 테이블과 값을 생성 한 문의 범위에 관계없이 연결에서 생성 된 마지막 IDENTITY 값을 반환합니다. @@ IDENTITY는 현재 세션의 테이블에 입력 된 마지막 ID 값을 반환합니다. @@ IDENTITY는 현재 세션으로 제한되며 현재 범위로 제한되지 않습니다. 예를 들어, 다른 테이블에서 ID가 생성되도록하는 테이블에 대한 트리거가있는 경우 해당 ID를 생성 한 트리거 인 경우에도 마지막으로 생성 된 ID를 가져옵니다.

SCOPE_IDENTITY ()

값을 생성 한 테이블에 관계없이 동일한 범위의 명령문과 연결에서 생성 된 마지막 IDENTITY 값을 반환합니다. SCOPE_IDENTITY ()는 @@ IDENTITY와 비슷하지만 값을 현재 범위로 제한합니다. 즉, 트리거 또는 사용자 정의 함수에 의해 생성 된 ID가 아니라 명시 적으로 생성 한 마지막 ID 값을 반환합니다.

IDENT_CURRENT ()

값을 생성 한 문의 연결 및 범위에 관계없이 테이블에서 생성 된 마지막 IDENTITY 값을 반환합니다. IDENT_CURRENT는 연결이나 범위가 아닌 지정된 테이블로 제한됩니다.


버그가 scope_identity()있으며 @@identityMS Connect를 참조하십시오. https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

인용문 (Microsoft에서 제공) :

모든 경우에 OUTPUT대신 사용 하는 것이 좋습니다 @@IDENTITY. ID와 타임 스탬프를 읽는 가장 좋은 방법입니다.

추가하기 위해 수정 됨 :이 문제는 지금 수정 될 수 있습니다. Connect에서 오류가 발생하지만 다음을 참조하십시오.

잘못된 값을 반환하는 Scope_Identity () 수정?


OUTPUT방금 삽입 된 행의 ID를 얻으려고 할 때 절 외에 다른 것을 사용할 이유가 거의 없습니다 . OUTPUT 절은 범위와 테이블에 안전합니다.

다음은 단일 행을 삽입 한 후 ID를 얻는 간단한 예입니다.

DECLARE @Inserted AS TABLE (MyTableId INT);

INSERT [MyTable] (MyTableColOne, MyTableColTwo)
OUTPUT Inserted.MyTableId INTO @Inserted
VALUES ('Val1','Val2')

SELECT MyTableId FROM @Inserted

OUTPUT 절에 대한 자세한 문서 : http://technet.microsoft.com/en-us/library/ms177564.aspx


-- table structure for example:     
CREATE TABLE MyTable (
    MyTableId int NOT NULL IDENTITY (1, 1),
    MyTableColOne varchar(50) NOT NULL,
    MyTableColTwo varchar(50) NOT NULL
)

@@ Identity는 구식 방식입니다. 앞으로의 모든 인스턴스에서 SCOPE_IDENTITY ()를 사용하십시오. @@ IDENTITY 사용의 영향에 대해서는 MSDN참조하십시오 (나쁘다!).


SCOPE_IDENTITY is sufficient for single rows and is recommended except in cases where you need to see the result of an intermediate TRIGGER for some reason (why?).

For multiple rows, OUTPUT/OUTPUT INTO is your new best friend and alternative to re-finding the rows and inserting into another table.


There is another method available in SQL Server 2005 that is outlined in SQL in the Wild.

This will allow you to retrieve multiple identities after insert. Here's the code from the blog post:

Create Table #Testing (  
    id int identity,  
    somedate datetime default getdate()  
)  
insert into #Testing  
output inserted.*  
default values

A small correction to Godeke's answer:

It's not just triggers you need to worry about. Any kind of nested operation, such as stored procs, that causes identifiers to be created could change the value of @@IDENTITY.

Another vote for scope_identity...


Be carreful while using @@IDENTITY ...

http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/

ReferenceURL : https://stackoverflow.com/questions/481395/identity-scope-identity-output-and-other-methods-of-retrieving-last-identi

반응형