【问题标题】:Sql Server return the value of identity column after insert statementSql Server 在插入语句后返回标识列的值
【发布时间】:2013-08-02 08:23:18
【问题描述】:

是否可以在 sql server 中使用存储过程在插入了一些值的表中返回标识列值?例如,如果我们在表中插入数据,则使用存储过程:

表 TBL

  • UserID 整数、标识、自动递增
  • 名称 varchar
  • 用户名 varchar
  • 密码 varchar

所以如果我运行存储过程插入一些值,例如:

 Insert into TBL (Name, UserName, Password)
 Values ('example', 'example', '$2a$12$00WFrz3dOfLaIgpTYRJ9CeuB6VicjLGhLset8WtFrzvtpRekcP1lq')

如何返回UserID 的值,在该值处进行插入。我需要 UserID 的值来进行其他一些操作,有人可以解决这个问题吗?

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

【讨论】:

  • @user2599269,我加了一对。
【解决方案2】:

这里有很多不同的方法来获取 ID,包括 Scope_Identity:

https://stackoverflow.com/a/42655/1504882

【讨论】:

    【解决方案3】:

    发送类似的输出参数

    @newId int output
    

    最终使用

        select @newId = Scope_Identity() 
    
         return @newId 
    

    【讨论】:

      【解决方案4】:

      您也可以使用 SELECT @@IDENTITY

      【讨论】:

      • 请不要使用它,因为@@IDENTITY 返回用于所有范围的最后一个标识值,而不仅仅是当前的,这可能是错误的。
      【解决方案5】:
      Insert into TBL (Name, UserName, Password) Output Inserted.IdentityColumnName
       Values ('example', 'example', 'example')
      

      【讨论】:

      • @AmitSingh this 和 scope_identity 有什么区别?句子Inserted.IdentityColumnName总是会返回一个正确的身份?,如果从两个插入同时插入会发生什么?。
      • @GastonF。它总是给出正确的值它给出任何列的输出不仅标识意味着它可以返回插入的整行..你可以通过 typnig 尝试插入.anycolumnname
      • @AmitSingh:太好了! +1,你的帖子我帮助我找到了这个和scope_identity()之间的使用差异,我发现了一些非常疯狂的东西,scope_identity()至少在2008版之前有一个错误,我不知道在那之后,反正微软建议使用Output Inserted......哇!检查此link。谢谢。
      • 请注意,如果您的 INSERT 插入多于 1 行,则 OUTPUT 语句将返回多于 1 行,其中一行包含插入的每个标识,而 SCOPE_IDENTITY() 将返回最后插入的标识值。因此,如果您使用 SCOPE_IDENTITY() 您最好确保您只能插入 1 行。您的示例就是这种情况。
      【解决方案6】:
      SELECT SCOPE_IDENTITY()
      

      插入语句之后

      请参考以下链接

      http://msdn.microsoft.com/en-us/library/ms190315.aspx

      【讨论】:

        【解决方案7】:

        您可以使用 SqlServer 的 OUTPUT 子句显式取回 Identity 列: 假设您有一个名为 ID 的标识/自动增量列:

        $sql='INSERT INTO [xyz].[myTable] (Field1, Field2, Field3) OUTPUT Inserted.ID VALUES  (1, 2, '3')';
        

        请注意,在 Perl DBI 中,您将执行 INSERT 语句,就像它是 SELECT 一样。 并像 SELECT 一样捕获输出

        $sth->execute($sql);
        @row=$sth->fetchrow_array; #Only 1 val in 1 row returned
        print "Inserted ID: ", $row[0], "\n";
        

        大概这是更可取的,因为它不需要另一个请求。

        【讨论】:

        • 这与接受的答案有何不同?
        猜你喜欢
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        相关资源
        最近更新 更多