6

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

代码只是为了说明问题:

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 
4

3 回答 3

10

SCOPE_IDENTITY() 之后使用_INSERT

--
DECLARE @newId INT 
INSERT INTO MyTable1(
   Field1
)
SELECT @MyVal1
--End of Insert here
SELECT @newId = SCOPE_IDENTITY()
--Rest of the procedure
于 2012-12-03T12:57:21.580 回答
2

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

set @TheUnknownIdValue = scope_identity()

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

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

于 2012-12-03T12:58:33.903 回答
1

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

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

如果第一次插入失败,您是否应该中止整个过程?查看 SQL Server 中的 Try/Catch,您会在那里找到一些好的模式。

于 2012-12-03T12:57:21.143 回答