到目前为止,我有以下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)
我想要做的是在我的SQL中稍后在另一个insert语句中使用生成的@@IDENTITY
值,但我希望获得 ALL 的身份,包括用户已存在且未插入的。我知道我之后总是可以做另一个选择声明,但我不确定这是最好的方法吗?
INSERT INTO @UserResults (UserResults, UserId)
SELECT Username, UserId
FROM User
INNER JOIN @NewUsers new ON new.Username = User.Username
我认为有一种更有效的方法可以使用OUTPUT
子句填充所有身份(新插入和/或现有)的Results表,但我不确定...有没有更好的方法方式比我正在做的方式?
答案 0 :(得分:3)
您希望看到所有身份,甚至是已经存在的行。这意味着仅output
条款是不够的。无论如何,您之后还需要一个新的查询:
select u.id
from @NewUsers nu
join [User] u
on u.Username = nu.Username
由于较早的“不存在”子查询,具有相关用户的页面将在内存中。因此,从效率的角度来看,这无需担心。