2012-10-30 4 views
2

는 지금까지 다음과 같은 SQL ...새로 삽입되었거나 이미 존재하는 레코드의 ID 값을 얻는 방법은 무엇입니까?

-- SETUP MY SQL 
DECLARE @NewUsers TABLE (Username VARCHAR(32), Name VARCHAR(32)) 
DECLARE @UserResults TABLE (UserName VARCHAR(32), UserId INT) 

INSERT INTO @NewUsers (Username, Name) 
VALUES ('johndoe', 'John Doe'), 
     ('janedoe', 'Jane Doe'), 
     ('mrsmith', 'Mr Smith') -- This guy already exists in the DB though... 

-- INSERT STATEMENT 

INSERT INTO User (Username, Name) 
    SELECT new.Username, new.Name 
    FROM @NewUsers new 
    WHERE NOT EXISTS (SELECT 1 FROM dbo.User WHERE User.Username = new.Username) 

이 내가 내 SQL에서 나중에 또 다른 삽입 문에서 사용하는 결과 @@IDENTITY 값을 얻을 수있다 싶지,하지만 난 싶어 ALL (이미 존재했지만 삽입되지 않은 사용자 포함). 나는 나중에 다른 선택 진술을 할 수 있다는 것을 알고 있지만 그것이 최선의 방법이라고 확신하지 못합니까?

INSERT INTO @UserResults (UserResults, UserId) 
    SELECT Username, UserId 
    FROM User 
    INNER JOIN @NewUsers new ON new.Username = User.Username 

나는 모든 아이덴티티 OUTPUT 절을 사용하여 (새로 삽입 및/또는 기존)과 결과 테이블을 채울 수있는보다 효율적인 방법이 생각하지만, 잘 모르겠어요은 ... 거기가 낫다 내가하는 방식보다?

답변

3

이미 존재하는 행조차도 모든 ID를보고 싶습니다. 즉, output 절만으로는 충분하지 않습니다. 이후에 새로운 쿼리가 필요할 것입니다.

이전의 "존재하지 않는"하위 쿼리로 인해 관련 사용자의 페이지가 메모리에 저장됩니다. 그래서 효율성의 관점에서 볼 때 이것은 전혀 걱정할 필요가 없습니다.

+0

기본적으로 나는 이미 올바르게하고있었습니다 ... –

+0

예, 동의합니다. 오늘날의 데이터베이스는 매우 빠릅니다. 실제 성능 문제가 발생할 때까지 성능 고려 사항을 무시하는 것이 가장 좋습니다. # 1 고려 사항은 명확해야하며 현재 접근 방식은 간단하고 좋습니다. – Andomar

관련 문제