在TSQL事务中,我有一个将记录插入MyTable1
的操作,以及更新MyTable2
Identity
MyTable1
列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
列的操作记录,仅在事务提交后插入。
那么,如何在实际插入表格之前获取该自动生成的值?
代码只是为了说明问题:
{{1}}
答案 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)
使用SCOPE_IDENTITY(),它给出了最后生成的标识值
UPDATE MyTable2
SET MyTable1Id = SCOPE_IDENTITY() -- how to get the value needed here
WHERE ...
如果第一次插入失败,您是否应该中止整个事情?查看SQL Server中的Try / Catch,你会发现一些好的模式。