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

时间:2018-05-25 16:05:47

标签: sql-server sql-server-2008-r2

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

INSERT INTO MyTable (Name)
VALUES ('First'),
('Second'),
('Third'),
('Fourth'),
('Fifth');

SELECT INSERTED Name, ID FROM TheAboveQuery 

ID是自动索引列吗?

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

2 个答案:

答案 0 :(得分:4)

从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');

答案 1 :(得分:2)

当然,您可以在ID字段上使用IDENTITY属性,并在其上创建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返回受执行的 last 语句影响的行数。您始终可以在SQL Server Management Studio的“消息”选项卡中看到此内容。因此,我们获取插入的行数并将其与TOP组合,这将查询中返回的行限制为指定的行数(如果使用[PERCENT],则为百分比)。 使用ORDER BY时使用TOP非常重要,否则results aren't guaranteed to be the same

从我之前编辑过的答案......

如果您正在尝试查看插入了哪些值,那么我假设您以不同的方式插入它们,这通常使用OUTPUT子句处理,如果您在尝试对这些记录执行某些操作后触发TRIGGER插入等...需要更多信息。