【问题标题】:In SQL Server is it possible to get "id" of a record when Insert is executed?在 SQL Server 中,执行插入时是否可以获得记录的“id”?
【发布时间】:2008-09-10 19:56:54
【问题描述】:

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

重复:
Best way to get identity of inserted row?

【问题讨论】:

    标签: sql-server identity


    【解决方案1】:

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

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

    像魅力一样工作。

    【讨论】:

    • 这个解决方案在只处理单行更新时很好。有关良好的批量更新解决方案,请参阅 kamajo 的回答。
    • 对于那些正在寻找如何使用 MySQL 的人:只需将 SCOPE_IDENTITY 替换为 LAST_INSERT_ID。或者干脆在 MySqlCommand 上使用 LastInsertedId 参数;
    • 将 ExecuteScalar() 的返回值直接转换为 int 时出现错误。当我将其转换为小数时工作正常。
    【解决方案2】:

    如果要插入多行,在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  
    

    【讨论】:

    • 顺便说一句,不确定它是否是特定于版本的(现在是 2012 年,我使用的是 SQL 10.0.1600),但您不必为此通过临时表 - 您可以直接输出。我也喜欢这也适用于 GUID 字段,如果它们被用作 PK...不是我提倡这样做,但它有效。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        您必须选择 scope_identity() 函数。

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-15
              • 2011-05-09
              • 2021-04-06
              相关资源
              最近更新 更多