programing

Scope_Identity(), Identity(), @@Identity 및 Ident_Current()의 차이점은 무엇입니까?

padding 2023. 4. 8. 08:02
반응형

Scope_Identity(), Identity(), @@Identity 및 Ident_Current()의 차이점은 무엇입니까?

는 알고 있다Scope_Identity(),Identity(),@@Identity , , , , 입니다.Ident_Current()모두 아이덴티티 컬럼의 값을 알고 있습니다만, 그 차이를 알고 싶습니다.

제가 안고 있는 논쟁의 일부는 위의 기능에 적용된 범위라는 것이 무엇을 의미하는가 하는 것입니다.

또한 다양한 사용 시나리오의 간단한 예를 들어보고 싶습니다.

  • @@identity함수는 같은 세션에서 마지막으로 생성된 ID를 반환합니다.
  • scope_identity()함수는 동일한 세션 및 범위에서 마지막으로 생성된 ID를 반환합니다.
  • ident_current(name)는 세션 내의 특정 테이블 또는 뷰에 대해 마지막으로 작성된아이디 ★★★★★★★★★★★★★★★★★.
  • identity() 때 하는 것이 때 select...into

세션은 데이터베이스 연결입니다.스코프는 현재 쿼리 또는 현재 저장 프로시저입니다.

scope_identity()@@identity테이블에 트리거가 있는 경우 기능이 다릅니다.가 다른 , 는 다른 레코드를 삽입할 수 있습니다.scope_identity()는 " " " 입니다.@@identity아이디

보통 하면 '아까', '아까', '아까보다'를 합니다.scope_identity()★★★★★★ 。

좋은 질문입니다.

  • @@IDENTITY에서 마지막으로 SQL ID(SPID)입니다. 수 예: '가 '방아쇠'에 ).INSERT는 또 다른 '실행하다'를 INSERT이치노

  • SCOPE_IDENTITY(): 현재 스코프에서 생성된 마지막 ID 값(예: 저장 프로시저, 트리거, 함수 등)을 반환합니다.

  • IDENT_CURRENT() 아이디입니다.ID 의 을 ID 로부터하지 말아 .INSERT레이스 조건(같은 테이블에 행을 삽입하는 여러 연결)의 영향을 받습니다.

  • IDENTITY()할 때 아이디입니다.

자세한 것은, http://msdn.microsoft.com/en-us/library/ms187342.aspx 를 참조해 주세요.

요약: 행을 삽입할 때 삽입한 의 ID 열 값을 확인하려면 항상 다음을 사용하십시오.SCOPE_IDENTITY().

범위와 세션의 차이를 이해하면 이러한 방법을 쉽게 이해할 수 있습니다.

Adam Anderson의 블로그 투고는 이 차이를 다음과 같이 설명하고 있습니다.

세션은 명령을 실행하는 현재 연결을 의미합니다.

스코프는 명령어의 즉시 컨텍스트를 의미합니다.스토어드 프로시저 콜은 각각 독자적인 범위 내에서 실행되며, 네스트된 콜은 호출 프로시저의 범위 내에서 네스트된 범위에서 실행됩니다.마찬가지로 응용 프로그램 또는 SSMS에서 실행되는SQL 명령어는 자체 범위 내에서 실행됩니다.이 명령어가 트리거를 호출하면 각 트리거는 자체 중첩 범위 내에서 실행됩니다.

따라서 3가지 아이덴티티 취득 방법의 차이는 다음과 같습니다.

@@identity이 세션에서 생성된 마지막 ID 값(범위는 제외)을 반환합니다.

scope_identity()는 이 세션과 이 범위에서 마지막으로 생성된ID 값을 반환합니다.

ident_current()세션 및 스코프특정 테이블에 대해 생성된 마지막 ID 값을 반환합니다.

는 스코프를 실행하는 컨텍스트를 합니다.INSERT 「」SCOPE_IDENTITY() 「」와 @@IDENTITY.

CREATE TABLE Foo(
  ID INT IDENTITY(1,1),
  Dummy VARCHAR(100)
)

CREATE TABLE FooLog(
  ID INT IDENTITY(2,2),
  LogText VARCHAR(100)
)
go
CREATE TRIGGER InsertFoo ON Foo AFTER INSERT AS
BEGIN
  INSERT INTO FooLog (LogText) VALUES ('inserted Foo')
  INSERT INTO FooLog (LogText) SELECT Dummy FROM inserted
END

INSERT INTO Foo (Dummy) VALUES ('x')
SELECT SCOPE_IDENTITY(), @@IDENTITY 

다른 결과를 얻을 수 있습니다.

를 하다@@Identity:

를 들어,때그삽입을 하는 트리거가 ,@@Identitya a리를를ID)를 합니다.log_id, 뭐가 있는 동안scope_identity()아이디입니다.

그래서 만약 당신이 어떤 방아쇠도 없다면scope_identity() ★★★★★★★★★★★★★★★★★」@@identity는 같은 값을 반환합니다.트리거가 있다면 원하는 가치를 생각해야 합니다.

Scope Identity: 실행 중인 저장 프로시저 내에 추가된 마지막 레코드의 ID.

@@Identity: 쿼리 배치 내에 추가된 마지막 레코드의 ID 또는 쿼리의 결과(예를 들어 삽입을 실행하는 절차)로 인해는 트리거를 기동하여 레코드를 삽입하는 트리거에서 삽입된 레코드의 ID를 반환합니다.

IdentCurrent 아이디 '' '' '' ''

책의 또 다른 좋은 설명은 다음과 같습니다.

SCOPE_IDENTY 와 @@IDENTITY 의 차이에 대해서는, 다음의 3 개의 스테이트먼트를 가지는 스토어드 프로시저 P1 이 있다고 합니다.
- ID - INSERT
콜 - "INSERT" "INSERT"
@@IDENTY .SCOPE_IDENTY 는 P1 및 스코프된 값을 합니다.- SCOPE_IDENTY는 @@@IDENTY의 P1입니다.@@IDENTY 함수는 P2에 의해 생성된 값을 반환합니다(범위에 관계없이 동일한 세션).

언급URL : https://stackoverflow.com/questions/1920558/what-is-the-difference-between-scope-identity-identity-identity-and-ide

반응형