代码之家  ›  专栏  ›  技术社区  ›  Patrick

在进行多个插入时,我可以获取插入的ID吗?

  •  1
  • Patrick  · 技术社区  · 8 年前

    在我看来,这听起来不太可能,但我想知道我是否能做到:

    INSERT INTO MyTable (Name)
    VALUES ('First'),
    ('Second'),
    ('Third'),
    ('Fourth'),
    ('Fifth');
    
    SELECT INSERTED Name, ID FROM TheAboveQuery 
    

    其中id是自动索引列?

    为了澄清,我只想选择新插入的行。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Dmitry Kolchev    8 年前

    从SQL Server 2008开始,可以将output子句与insert语句一起使用

    DECLARE @T TABLE (ID INT, Name NVARCHAR(100))
    
    INSERT INTO MyTable (Name)
    OUTPUT INSERTED.ID, INSERTED.Name INTO @T
    VALUES 
       ('First'),
       ('Second'),
       ('Third'),
       ('Fourth'),
       ('Fifth');
    
    SELECT Name, ID FROM @T;
    

    更新:如果表没有触发器

    INSERT INTO MyTable (Name)
    OUTPUT INSERTED.ID, INSERTED.Name
    VALUES 
       ('First'),
       ('Second'),
       ('Third'),
       ('Fourth'),
       ('Fifth');
    
        2
  •  2
  •   S3S    8 年前

    当然,您可以使用 IDENTITY 您的财产 ID 字段,并创建 CLUSTERED INDEX 关于它

    ONLINE DEMO

    create table MyTable (  ID int identity(1,1), 
                            [Name] varchar(64),
                            constraint [PK_MyTable] primary key clustered (ID asc) on [Primary]
                         )
    
    
    --suppose this data already existed...
    INSERT INTO MyTable (Name)
    VALUES 
    ('First'),
    ('Second'),
    ('Third'),
    ('Fourth'),
    ('Fifth');
    
    
    --now we insert some more... and then only return these rows
    INSERT INTO MyTable (Name)
    VALUES 
    ('Sixth'),
    ('Seventh')
    
    
    select top (@@ROWCOUNT)
        ID, 
        Name 
    from MyTable
    order by ID desc
    

    @@ROWCOUNT 返回受 最后的 语句已执行。您总是可以在SQL Server Management Studio的“消息”选项卡中看到这一点。因此,我们获取插入的行数并将其与 TOP 使用它很重要 ORDER BY 使用时 顶部 否则你的 results aren't guaranteed to be the same

    从我以前编辑的答案…

    如果您试图查看插入了什么值,那么我假设您以不同的方式插入它们,并且这通常是通过一个output子句来处理的,如果您试图在插入后对这些记录执行某些操作,则会触发触发器,等等…需要更多信息。