복붙노트

[SQL] @@ IDENTITY, SCOPE_IDENTITY (), 출력 된 마지막 ID를 검색하는 다른 방법

SQL

@@ IDENTITY, SCOPE_IDENTITY (), 출력 된 마지막 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

삽입 다음과 정체성의 테이블을 반환 :

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

어떤 방법은 적절한 또는 더 나은 무엇입니까? 출력 방법 범위 안전인가?

두 번째 코드는 야생에서 SQL에서 차용되었다

해결법

  1. ==============================

    1.그것은 당신이 무엇을하려는 지에 따라 달라집니다 ...

    그것은 당신이 무엇을하려는 지에 따라 달라집니다 ...

    @@정체

    반환에 관계없이 관계없이 값을 생성 한 Statement의 범위의 값을 생성하고 테이블의 연결에서 생성 된 마지막 ID 값. @@ IDENTITY는 현재 세션의 테이블에 입력 된 마지막 ID 값을 반환합니다. @@ IDENTITY 현재 세션에 한정되어 현재의 범위에 한정되지 않는다. 당신은 신원이 다른 테이블에 작성되도록 테이블에 트리거가있는 경우 예를 들어, 당신은 그것을 만든 트리거 경우에도, 마지막으로 생성 된 ID를 얻을 것이다.

    SCOPE_IDENTITY ()

    에 관계없이 값을 생성 한 테이블에, 연결과 같은 범위의 문에 의해 생성 된 마지막 ID 값을 반환합니다. SCOPE_IDENTITY는 ()에 @@ IDENTITY와 유사하지만, 그것은 또한 당신의 현재 범위에 값을 제한합니다. 즉, 오히려 트리거 또는 사용자 정의 함수에 의해 생성 된 어떤 정체성을보다 명시 적으로 생성 된 마지막 ID 값을 반환합니다.

    IDENT_CURRENT ()

    테이블에서 생성 된 마지막 IDENTITY 값에 관계없이 값을 생성 한 Statement의 연결 및 범위를 돌려줍니다. IDENT_CURRENT는 있지만 연결 또는 범위에 의해, 지정된 테이블로 제한됩니다.

  2. ==============================

    2.SCOPE_IDENTITY (에 버그가 있다는 사실 주)와 @@ IDENTITY - 참조 MS 연결 : https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

    SCOPE_IDENTITY (에 버그가 있다는 사실 주)와 @@ IDENTITY - 참조 MS 연결 : https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

    (마이크로 소프트)에서 인용 한 :

    추가로 편집이 이제 고정 될 수있다. 연결은 나에게 오류를 제공하지만, 볼 수 있습니다 :

    잘못된 값을 반환 SCOPE_IDENTITY ()는 고정?

  3. ==============================

    3.행 (들)의 신원 방금 삽입을 얻으려고 노력하는 출력 절 외에 사용 아무것도 거의없는 이유가있다. OUTPUT 절은 범위와 테이블 안전합니다.

    행 (들)의 신원 방금 삽입을 얻으려고 노력하는 출력 절 외에 사용 아무것도 거의없는 이유가있다. 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
    )
    
  4. ==============================

    4.@@ IDENTITY는 오래된 학교 방법입니다. 모든 경우에 사용 SCOPE_IDENTITY ()는 앞으로. @@ IDENTITY 사용의 영향에 대한 MSDN을 참조하십시오 (그들이있는 거 나쁜!).

    @@ IDENTITY는 오래된 학교 방법입니다. 모든 경우에 사용 SCOPE_IDENTITY ()는 앞으로. @@ IDENTITY 사용의 영향에 대한 MSDN을 참조하십시오 (그들이있는 거 나쁜!).

  5. ==============================

    5.SCOPE_IDENTITY는 단일 행에 대한 충분하고 어떤 이유로 중간 TRIGGER의 결과를 볼 필요가 경우를 제외하고 권장합니다 (왜?).

    SCOPE_IDENTITY는 단일 행에 대한 충분하고 어떤 이유로 중간 TRIGGER의 결과를 볼 필요가 경우를 제외하고 권장합니다 (왜?).

    여러 행의 경우, OUTPUT / OUTPUT INTO는 당신의 새로운 가장 친한 친구와 다시 찾는 행을 다른 테이블에 삽입하는 대안이다.

  6. ==============================

    6.야생에서 SQL에 설명되어 SQL 서버 2005에서 사용할 수있는 다른 방법이있다.

    야생에서 SQL에 설명되어 SQL 서버 2005에서 사용할 수있는 다른 방법이있다.

    이것은 당신이 삽입 한 후 여러 ID를 검색 할 수 있습니다. 여기에 블로그 게시물의 코드는 다음과 같습니다

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

    7.Godeke의 대답에 작은 수정 :

    Godeke의 대답에 작은 수정 :

    그냥 아니라 당신에 대해 걱정할 필요가 트리거합니다. 원인 식별자가 생성 될 수 있도록 저장 프록 중첩 된 동작, 어떤 종류 @@ IDENTITY의 값을 변경할 수있다.

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

  8. ==============================

    8.@@ IDENTITY를 사용하는 동안주의해야 ...

    @@ IDENTITY를 사용하는 동안주의해야 ...

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

  9. from https://stackoverflow.com/questions/481395/identity-scope-identity-output-and-other-methods-of-retrieving-last-identi by cc-by-sa and MIT license