2009-05-06 3 views
2

마찬가지로 previous question과 비슷한 맥락에서 나는 여러분에게 집단 지혜와 도움을 요청합니다.방금 ​​추가 한 행의 ID를 반환하십시오.

저장 프로 시저에서 일부 검사를 통과 한 후 새 행을 삽입하고 새로 만든 ID를 반환해야합니다. 행이 존재하는지 점검하여 작동하지 않도록 비트를 처리합니다.

표에는 두 개의 중요한 열인 LocationID와 CaseID가 있습니다. CaseID는 자동 증가하므로 새로운 위치 정보를 삽입하면 자동으로 움직입니다.

나는 현재이 있습니다

-- previous checks for existance of CaseID 

IF @CaseID IS NULL 
BEGIN 
    INSERT INTO 
     Cases(LocationID) 
    VALUES 
     (@LocationID) 

    -- what now? 
END 

난 후 immeadiately @CaseID = (SELECT blah) 문을 수행하는 생각하지만, 더 나은 방법이 있는지 궁금 해서요?

더 좋은 방법이 있습니까? 어떻게 할거 니? (즉, 저장된 프로 시저의 끝 부분 인 경우.)

+0

SET @id = SCOPE_IDENTITY()를 사용하고 @@ IDENTITY를 잊어 버리십시오. ID 값을 생성하는 테이블에 트리거가 있으면 @@ IDENTITY는 원래 INSERT ID가 아닌 해당 ID 값을 반환하지만 SCOPE_IDENTITY()는 현재 범위 내에서 적절한 ID를 반환합니다. –

답변

4
SELECT @CaseID = SCOPE_IDENTITY() 

사실, 당신은 할 수 있습니다 :

SELECT SCOPE_IDENTITY() 

(OUTPUT 절은 이후 SQL 서버 2005에서만 사용할 수 있습니다 ...)

참조 : SCOPE_IDENTITY

+0

이전에 이미 CaseID를 삽입 한 것 같아서 작동하지 않을 것이라고 생각합니다. 그는 현재 LocationID를 삽입하고 있으므로 SCOPE_IDENTITY()는 CaseID가 아니라 새로 삽입 된 LocationID를 반환합니다. 나는 그 질문을 오해하고 있을지도 모른다. 너 – Joseph

+0

입니다. 포스터는 CaseId가 자동 증가 열입니다 ... –

+0

좋아, 나는 왜 그가 @CaseID가 나에게 많은 감각을주지 못했던 삽입을하기 전에 NULL인지 체크하고 있었는지 알아 내려고 노력했다. – Joseph

1

SCOPE_IDENTITY()

+1

참고로 Scope_Identity() 및 @@ IDENTITY와 관련된 알려진 버그가 있습니다. https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811 –

+0

방금 ​​@@ IDENTITY 매크로가 나타났습니다 (?) 그리고 Brandon Reno가 대부분의 사람들이 사용하는 방법을 구현했습니다 : SET @id = SCOPE_IDENTITY(), 또는 제 경우 SET @ id = @@ IDENTITY –

+0

팁, KM에게 감사드립니다. 나는 그 버그를 몰랐다. INSERT 문에서 VALUES 절을 사용하는 한 안전하다고 생각하십니까? –

1

다른 사람이 언급 한 바와 같이, SCOPE_IDENTITY() 일부 ORM 도구뿐만 아니라이 기능을 제공하지만, 길을 가야하는 것입니다.

기억해야 할 것은 SCOPE_IDENTITY()가 현재 세션에서만 생성 된 마지막 신원 키 값을 반환한다는 것입니다. 이 기능은 다른 클라이언트가 동시에 생성 한 새 키를 필터링하는 데 유용합니다. SELECT @@ IDENTITY는 모든 클라이언트/세션에 의해 생성 된 마지막 키를 반환합니다.

+0

감사합니다. Rich : 나는 그 사실을 알고 있지 않았습니다. – IrishChieftain

관련 문제