首页 / 知识

关于身份:在SQL Server中,执行插入时是否可以获取记录的” id”?

2023-04-14 21:29:00

关于身份:在SQL Server中,执行插入时是否可以获取记录的” id”?

In SQL Server is it possible to get “id” of a record when Insert is executed?

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

duplicate of:
Best way to get identity of inserted row?


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

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

像吊饰一样工作。


如果要插入多行,则在insert语句上使用OUTPUTINSERTED.columnname子句是将所有ID放入临时表的一种简单方法。

1
2
3
4
5
6
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

SCOPE_IDENTITY();是您最好的选择。而且,如果您使用的是.NET,则只需传递一个我们的参数,然后在执行该过程后检查该值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();

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


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

创建触发器tblName
在dbo.tblName上
对于插入

选择new_id = @@ IDENTITY

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


您必须选择scope_identity()函数。

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


这可能是我为SQL Server找到的最佳工作解决方案。
SQL Server在插入语句后返回标识列的值


身份执行字段属性

最新内容

相关内容

猜你喜欢