如何在事务中获取Identity列值(尚未提交)

时间:2012-12-03 12:53:21

标签: sql-server tsql transactions identity

在TSQL事务中,我有一个将记录插入MyTable1的操作,以及更新MyTable2 Identity MyTable1CREATE TABLE MyTable1( MyTable1Id int identity(1,1) primary key, Field1 varchar(50) ) CREATE TABLE MyTable2( MyTable2Id int identity(1,1) primary key, MyTable1Id int ) CREATE PROCEDURE MyProc( @MyVal1 [varchar](50) ) AS BEGIN TRAN -- try to insert INSERT INTO MyTable1( Field1 ) SELECT @MyVal1 IF @@ERROR <> 0 BEGIN ROLLBACK TRAN END -- update MyTable2 DECLARE @TheUnknownIdValue int UPDATE MyTable2 SET MyTable1Id = @TheUnknownIdValue -- how to get the value needed here? WHERE ... IF @@ERROR <> 0 BEGIN ROLLBACK TRAN END COMMIT TRAN 列的操作记录,仅在事务提交后插入。
那么,如何在实际插入表格之前获取该自动生成的值?

代码只是为了说明问题:

{{1}}

3 个答案:

答案 0 :(得分:9)

在<{strong> SCOPE_IDENTITY()

之后使用INSERT
--
DECLARE @newId INT 
INSERT INTO MyTable1(
   Field1
)
SELECT @MyVal1
--End of Insert here
SELECT @newId = SCOPE_IDENTITY()
--Rest of the procedure

答案 1 :(得分:2)

如果您一次插入一条记录,则可以使用scope_identity()函数:

set @TheUnknownIdValue = scope_identity()

在插入MyTable1之后立即执行此操作。

如果要插入多行,最好的方法是使用OUTPUT子句将所有新标识放入工作表中。

答案 2 :(得分:1)

SQL Server中的

使用SCOPE_IDENTITY(),它给出了最后生成的标识值

UPDATE MyTable2
SET    MyTable1Id = SCOPE_IDENTITY() -- how to get the value needed here
WHERE ...

如果第一次插入失败,您是否应该中止整个事情?查看SQL Server中的Try / Catch,你会发现一些好的模式。