2012-10-30 35 views
2

我有以下SQL那么远,如何获取新插入或已存在记录的标识值?

-- 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) 

我想要做的就是所产生的@@IDENTITY值到另一个INSERT语句在SQL我以后上使用,但我想所有的身份,包括已经存在且未被插入的用户。我知道我可以随时做另一个选择声明,但我不确定这是最好的方法吗?

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

我认为有填充结果表中的所有身份使用OUTPUT条款(新插入的和/或现有的),更有效的方式,但我不知道......有没有更好的比我在做什么的方式?

回答

3

你希望看到所有的身份,甚至是已经存在的行。这意味着仅仅output条款是不够的。无论如何你需要一个新的查询:

select u.id 
from @NewUsers nu 
join [User] u 
on  u.Username = nu.Username 

由于较早的“不存在”子查询,具有相关用户的页面将在内存中。所以从效率的角度来看,这无关紧要。

+0

所以基本上,我已经在正确地做它... –

+0

是的,我同意。今天的数据库非常快。在出现实际性能问题之前,最好忽略性能方面的考虑。 #1的考虑应该是清晰的,而你目前的方法简单而好。 – Andomar

相关问题