在SQL Server中,执行插入操作时是否可以获得记录的" id"?

时间:2020-03-05 18:51:02  来源:igfitidea点击:

在SQL Server 2005中,表中具有"标识"属性设置为"是"的" id"字段。因此,在该表上执行插入操作时," id"会自动设置为下一个递增整数。当执行插入操作以获取" id"所设置的内容而不必在插入之后立即执行Select语句时,是否有一种简便的方法?

duplicate of:

  Best way to get identity of inserted row?

解决方案

回答

我们必须选择scope_identity()函数。

为了从应用程序代码中做到这一点,我通常将此过程封装在一个存储过程中,因此它看起来仍然像对我的应用程序的一个查询。

回答

Scope_identity()是首选方法,请参见:6种获取当前身份值的不同方法

回答

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

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

奇迹般有效。

回答

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();

回答

如果要插入多行,则在insert语句上使用OUTPUTINSERTED.columnname子句是将所有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

回答

我倾向于使用企业管理器将触发器添加到表上。这样,我们不必担心在代码中写出多余的sql语句。我的看起来像这样:

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

然后,从代码中,像选择语句一样对待插入语句。只需执行并评估结果即可。 " newID"列将包含我们刚刚创建的行的标识。