12

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

重复:
获取插入行标识的最佳方法?

4

7 回答 7

32

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

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

奇迹般有效。

于 2008-09-10T20:02:45.407 回答
15

如果要插入多行,则在语句中使用OUTPUTandINSERTED.columnname子句insert是一种将所有 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  
于 2008-09-10T20:51:40.453 回答
3

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

于 2008-09-10T20:02:00.667 回答
3

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();
于 2008-09-10T20:09:12.473 回答
1

您必须选择 scope_identity() 函数。

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

于 2008-09-10T19:58:31.733 回答
1

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

Create Trigger tblName On dbo.tblName For Insert As select new_id = @@IDENTITY

然后,在您的代码中,将您的插入语句视为选择语句 - 只需执行并评估结果。“newID”列将包含您刚刚创建的行的标识。

于 2008-09-10T21:08:38.180 回答
0

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

于 2015-01-02T10:30:07.890 回答