programing

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

yellowcard 2023. 7. 9. 10:59
반응형

@@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_전류()

값을 생성한 문의 연결 및 범위에 관계없이 테이블에서 생성된 마지막 IDENTITY 값을 반환합니다.IDENT_CURRENT는 지정된 테이블로 제한되지만 연결 또는 범위에 의해 제한되지 않습니다.

에 버그가 있습니다.scope_identity()그리고.@@identityMS Connect: https://web.archive.org/web/20130412223343/https ://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value 참조

인용문(Microsoft):

를 사용하는 것을 강력히 추천합니다.OUTPUT대신에@@IDENTITY어떤 경우에도그것은 신분과 타임스탬프를 읽는 가장 좋은 방법입니다.

추가할 편집: 지금 수정할 수 있습니다.연결 시 오류가 발생하지만 다음을 참조하십시오.

Scope_Identity()가 잘못된 값을 반환합니다. 수정하시겠습니까?

다른 것을 사용할 이유가 거의 없습니다.OUTPUT방금 삽입한 행의 ID를 가져올 때 절입니다.safe입니다.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
)

@@정체성은 오래된 학풍입니다.이후 모든 인스턴스에서 SCOPE_IDENTITY()를 사용합니다.@@IDENTITY 사용의 영향은 MSDN을 참조하십시오(그들은 나쁘다!).

SCOPE_IDENTITY는 단일 행에 충분하며, 어떤 이유로 중간 트리거의 결과를 확인해야 하는 경우를 제외하고 권장됩니다(이유는?).

여러 행의 경우 OUTPUT/OUTPUT INTO가 새로운 베스트 프렌드이며 행을 다시 찾고 다른 테이블에 삽입할 수 있는 대안입니다.

SQL Server 2005에서 사용할 수 있는 다른 방법은 SQL in the Wild에 설명되어 있습니다.

이렇게 하면 삽입 후 여러 개의 ID를 검색할 수 있습니다.블로그 게시물의 코드는 다음과 같습니다.

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

고데케의 대답에 대한 약간의 수정:

여러분이 걱정해야 할 것은 단지 방아쇠만이 아닙니다.저장된 프로시저와 같이 식별자를 생성하는 중첩된 작업은 @@IDENTITY 값을 변경할 수 있습니다.

scope_identity에 대한 또 다른 투표...

@@IDENTITY...를 사용할 때는 주의해야 합니다.

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

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

반응형