2011-11-22 2 views
2

내가 저장 프로 시저에서이 코드 조각이 :SQL Server는 SCOPE_IDENTITY 이해()

BEGIN 
    SET @UserId = NULL; 
    IF (@Username IS NOT NULL) 
    BEGIN 
     EXECUTE SP_ADD_USER @Username, @UserId OUTPUT; 
    END 
    EXECUTE SP_ADD_ALERT @Name, @AlertType, @AlertId OUTPUT; 
    INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage) 
     VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage); 
    SET @AlertLogId = SCOPE_IDENTITY(); 
END 

@AlertLogId 내가 AlertLogs 테이블의 마지막 삽입의 결과에 할당하려는 출력 매개 변수입니다. 내가 제대로 작동하려면 SCOPE_IDENTITY() 위해서는 새로운 블록 (새로운 시작/종료 범위)에서

INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage) 
     VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage); 

을 포함해야합니까? 은 (예를 들어, 예를 들어 SP_ADD_ALERT에서 수행 삽입 된 레코드의 마지막 ID를보고하지?) 귀하의 요청에

답변

6

, SCOPE_IDENTITY()이 범위에 대한 데이터베이스에 마지막으로 입력 한 ID 값을 반환 할 것입니다.

이 경우 ID가있는 경우 AlertLogs 테이블의 ID가됩니다.

스코프는 저장 프로 시저, 트리거, 기능 또는 배치 인 모듈입니다. 따라서 두 개의 명령문은 동일한 저장 프로 시저, 함수 또는 일괄 처리에있는 에있는 경우 동일한 범위에 있습니다.

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

+0

이것은 내가 예상 한 것입니다. EXECUTE SP_ADD_ALERT는 다른 범위에서 실행되므로 ID 값이 삽입되어 있어도 어떤 경우에도 고려되지 않습니다. – Ghita

+0

예 msdn 사이트에서 두 문이 동일한 저장 프로 시저, 함수 등 내에 있어야한다고 나와 있습니다. 함수에서'INSERT' 나'EXEC'처럼 사용할 수없는 것처럼'SCOPE_IDENTITY'를 사용하는 이유를 알지 못합니다. – Curt

+0

트리거가 무엇인가를 삽입하게하는 함수를 함수가 수행 할 수 있습니까? 그렇다면 삽입이 SCOPE_IDENTITY() 함수에서? –

1

또한 삽입 문에 OUTPUT clause를 사용할 수 있습니다. 즉, 범위에 대해 걱정할 필요가 없으며 삽입 된 테이블에서 다른 (식별 불가능한) 정보를 사용할 수 있습니다. 이 기본이 추가로

CREATE TABLE [dbo].[SampleTable](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [InsertDate] [datetime] NOT NULL, 
    [Name] [nvarchar](100) NULL 
) ON [PRIMARY] 

:

이 간단한 테이블을 고려

ALTER TABLE [dbo].[SampleTable] 
    ADD CONSTRAINT [DF_SampleTable_Inserted] 
     DEFAULT (getdate()) FOR [InsertDate] 

기본 및 삽입 작업에서 신원 모두에 대한 값을 얻을 수 있습니다.

여기 테이블 변수에서 값을 가져 와서 인쇄했습니다.

+0

기본 정보를 검색하는 좋은 방법입니다. 좋았어! – Ghita