在SQL SERVER中锁定并插入一行

时间:2013-10-30 02:36:12

标签: sql sql-server

我想插入一行并从过程中返回标识列值!为此,我不想使用@@identitySCOPE_IDENTITY等高级内容,因为我没有清楚了解它们的工作原理。 所以我打算这样做

  1. 锁定表格
  2. 执行插入
  3. 返回表格的最大值
  4. 我熟悉oracle lock

    lock table tab1 in exclusive mode;
    INSERT INTO tab1.....;
    select max(id) into retVal from tab1;
    

    问题:

    1. 我的方法有什么问题吗?
    2. 我如何在SQL SERVER中实现这一目标?

2 个答案:

答案 0 :(得分:2)

它是哪个版本的sql server?

如果您正在运行sql server 2008+(r2 i thing)

最安全的方法是使用插入的输出语句。

像这样:

插入客户(姓名,地址,电话)     输出inserted.CustomerId到@CustomerId 价值观(......)

答案 1 :(得分:1)

通过强制锁定数据库/表,您将创建的问题多于解决问题。让数据库管理系统(DBMS)管理数据库。

您需要做的就是:

BEGIN TRANSACTION --added after original answer
    INSERT INTO tab1....;
    SELECT @@identity AS [last_id] INTO retVal;
END TRANSACTION --added after original answer

我相信您知道只要SELECT...INTO retVal表尚不存在,您就只能retVal