Sql server 如何在事务中获取标识列值(尚未提交)

Sql server 如何在事务中获取标识列值(尚未提交),sql-server,tsql,transactions,identity,Sql Server,Tsql,Transactions,Identity,在TSQL事务中,我有一个将记录插入MyTable1的操作,以及一个使用MyTable1记录的Identity列的值更新MyTable2的操作,该列仅在事务提交后插入。,如何在将自动生成的值实际插入表中之前获取该值? 代码仅用于说明问题: CREATE TABLE MyTable1( MyTable1Id int identity(1,1) primary key, Field1 varchar(50) ) CREATE TABLE MyTable2( MyTable2Id int iden

在TSQL事务中,我有一个将记录插入
MyTable1
的操作,以及一个使用
MyTable1
记录的
Identity
列的值更新
MyTable2
的操作,该列仅在事务提交后插入。
,如何在将自动生成的值实际插入表中之前获取该值?

代码仅用于说明问题:

CREATE 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 
创建表MyTable1(
MyTable1Id int identity(1,1)主键,
字段1 varchar(50)
) 
创建表MyTable2(
MyTable2Id int identity(1,1)主键,
MyTable1Id int
)
创建过程MyProc(
@MyVal1[varchar](50)
)
作为
开始训练
--试着插入
插入MyTable1(
字段1
)
选择@MyVal1
如果@错误0
开始
回滚传输
结束
--更新MyTable2
声明@TheUnknownIdValue int
更新MyTable2
SET MyTable1Id=@TheUnknownIdValue——如何获取此处所需的值?
哪里
如果@错误0
开始
回滚传输
结束
提交传输

在SQL Server中,使用SCOPE_IDENTITY(),它给出最后生成的标识值

UPDATE MyTable2
SET    MyTable1Id = SCOPE_IDENTITY() -- how to get the value needed here
WHERE ...
如果第一次插入失败,您是否应该中止整个过程?查看SQL server中的Try/Catch,您会发现一些不错的模式。

在插入
之后使用
SCOPE\u IDENTITY()

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

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

set @TheUnknownIdValue = scope_identity()
在插入MyTable1之后执行此操作


在需要插入多行的情况下,最好的方法是使用OUTPUT子句将所有新标识获取到一个工作表中。

只要尚未插入—尚未定义。时期
IDENTITY
列的值仅在插入时定义。@marc_s因此,对于我在问题中提供的代码(只要我们在交易中),就不可能用这样的值进行更新?否-在
插入MyTable1
之后,您可以使用
SCOPE\u identity()
获取上次插入的
表1
的标识-这就是您要查找的吗?行必须插入到表中,但还不必提交。@marc_谢谢,marc。是的,只有在提交整个事务时,我才需要Id值。如果它被回滚,那么所有内容都应该像以前一样,在本例中,我不关心要使用的标识值。