在SQL Server中,执行Insert时是否可以获取记录的“id”?

时间:2008-09-10 19:56:54

标签: sql-server identity

在SQL Server 2005中,我在“Is Identity”属性设置为“Yes”的表中有一个“id”字段。因此,当在该表上执行Insert时,“id”将自动设置为下一个递增整数。执行Insert时是否有一种简单的方法可以获得“id”的设置,而不必在插入后立即执行Select语句?

  

副本:
  Best way to get identity of inserted row?

7 个答案:

答案 0 :(得分:32)

至少在.Net中,您可以一次性向服务器发送多个查询。我在我的应用程序中执行此操作:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();

像魅力一样。

答案 1 :(得分:15)

如果要插入多行,则在OUTPUT语句中使用INSERTED.columnnameinsert子句是将所有id都放入临时表的简单方法。

DECLARE @MyTableVar table( ID int,  
                               Name varchar(50),  
                               ModifiedDate datetime);  
INSERT MyTable  
        OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar  
SELECT someName, GetDate() from SomeTable  

答案 2 :(得分:3)

Scope_identity()是首选方式,请参阅:6 Different Ways To Get The Current Identity Value

答案 3 :(得分:2)

SCOPE_IDENTITY();是你最好的选择。如果您使用的是.NET,只需传递一个参数并在程序运行后检查该值。

CREATE PROCEDURE [dbo].[InsertProducts]
    @id             INT             = NULL OUT,
    @name           VARCHAR(150)    = NULL,
    @desc           VARCHAR(250)    = NULL

AS

    INSERT INTO dbo.Products
       (Name,
        Description)
    VALUES
       (@name,
        @desc)

    SET @id = SCOPE_IDENTITY();

答案 4 :(得分:1)

您必须选择scope_identity()函数。

要从应用程序代码执行此操作,我通常会将此进程封装在存储过程中,因此它仍然看起来像是对我的应用程序的一个查询。

答案 5 :(得分:1)

我更倾向于使用企业管理器将触发器附加到表中。这样您就不必担心在代码中写出额外的sql语句了。我看起来像这样:

创建触发器tblName 在dbo.tblName上 对于插入 如 选择new_id = @@ IDENTITY

然后,从代码中,将insert语句视为select语句 - 只需执行并评估结果即可。 “newID”列将包含您刚刚创建的行的标识。

答案 6 :(得分:0)

这可能是我为SQL Server找到的最佳工作解决方案.. Sql Server return the value of identity column after insert statement