Sql server 如何在事务中获取标识列值(尚未提交)
在TSQL事务中,我有一个将记录插入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
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值。如果它被回滚,那么所有内容都应该像以前一样,在本例中,我不关心要使用的标识值。