【问题标题】:How to get the identity values of records that were newly inserted or already existing?如何获取新插入或已经存在的记录的标识值?
【发布时间】:2012-10-30 17:15:29
【问题描述】:

到目前为止,我有以下 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 值,以便稍后在我的 SQL 中的另一个插入语句中使用,但我想获取 ALL 的身份,包括已经存在但未插入。我知道我总是可以在之后再做一个 select 语句,但我不确定那是最好的方法吗?

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

我认为有一种更有效的方法可以使用 OUTPUT 子句使用所有身份(新插入和/或现有)填充结果表,但我不确定......有没有比这更好的方法我正在做什么?

【问题讨论】:

    标签: sql sql-server insert sql-server-2012 identity


    【解决方案1】:

    您希望查看所有身份,甚至是已经存在的行。这意味着仅output 子句是不够的。无论如何,您之后都需要一个新的查询:

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

    由于先前的“不存在”子查询,具有相关用户的页面将在内存中。所以从效率的角度来看,这没什么好担心的。

    【讨论】:

    • 是的,我同意。今天的数据库非常快。在出现实际性能问题之前,最好忽略性能考虑。第一个考虑因素应该是清晰,您当前的方法既简单又好。
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多