4

저장 프로 시저에서 마지막으로 삽입 된 행의 ID를 반환하려고합니다.저장 프로 시저에서 마지막으로 삽입 된 행의 ID 반환

내 코드의 단순화 된 버전은 다음과 같습니다 : I 엔터프라이즈 라이브러리 4.1 스칼라 실행을 통해이 저장 프로 시저를 호출하고

CREATE PROCEDURE [sp_name] 
    @AuthorisationCode uniqueidentifier 
AS 
    INSERT INTO [tablename] 
      ([AuthorisationCode] 
      ) 
    VALUES 
      (@AuthorisationCode 
      ) 

RETURN @@IDENTITY 

GO 

.

null을 반환합니다. 아무도 내가 뭘 잘못하고 있는지 안다.

+0

제발, sp_ 접두어로 procs의 이름을 지정하지 않는 것이 가장 좋습니다. 하지만 어쨌든 그것은 psuedocode 일 수 있습니다. –

+0

@Mark, 좋은 캐치, 고마워, 그냥 psuedocode입니다. –

+0

** 반환 값은 일반적으로 오류 처리를 위해 예약되어 있습니다 (예 : 0 이외의 경우 오류가 있음을 나타냄). – Brad

답변

13

난 당신이 저장되지 않을 수 있습니다 삽입 된 마지막의 신원을 (반환 SCOPE_IDENTITY()@@identity로를 이용해야한다라고 말하고 싶지만 여러 개의 쿼리가 동시에 실행중인 경우 절차).

또한 리턴해야하는 것이 아니라 리턴해야합니다.

ExecuteScalar은 결과 집합의 첫 번째 행에서 첫 번째 열 값을 반환합니다.

그래서 ...

SELECT SCOPE_IDENTITY(); 

당신이 원하는 더 아마도.

+0

+1입니다. – Brad

0

당신이 select @@identity

+2

나는 downvote하고 싶지 않지만,'@@ identity' 대신에'SCOPE_IDENTITY'를 사용해야합니다. (MrEyes 답 참조) – Brad

+0

@@ identity는이 경우에는 괜찮을 것입니다. 현재 ID, 범위 ID 및 @@ ID의 차이를 이해하는 것은 중요하지만 @@ ID가 항상 잘못된 것은 아닙니다. 경건하지 않은 이유로 인서트 타임에 신원을 바꾸는 방아쇠가 있고 삽입 된 마지막 신분을 알고 싶다면 어떨까요? 그러면 @@ identity가 필요하고 scope_identity는 작동하지 않습니다. –

+0

예 Brad, 사실입니다. scope_identity를 사용하는 것이 더 나은 선택입니다. (음, 더 나은 선택이 아니라, 당신의 필요에 따라 달라집니다.) Althouhg, 내 대답에, 나는 "반환"의 사용을 언급했다. 그리고 downvoting이 올바른 선택입니다, 그것은 두 가지의 중요한 차이입니다. – futile

7

당신은 오히려 수익보다 선택 사용하여야한다,하지만 당신은 또한 잘못된 ID가 반환되는 문제를 방지하기 위해 SCOPE_IDENTITY을 사용해야합니다, @@ IDENTITY는 특정 범위로 제한되지 않습니다.

SELECT SCOPE_IDENTITY() 

더 많은 정보를 여기에서 찾을 수 있습니다 :

http://msdn.microsoft.com/en-us/library/ms190315.aspx

+0

+1 번 이상 투표 할 수있다. 이것은 ExecuteScalar에 대한 설명을 위해 활용도가 낮은 키워드 – Brad