我有PK是自递增键。我需要将记录插入数据库,然后取回该 PK 并在另一个插入中使用它。
但是,我想在一个事务中执行此操作。这可能吗。这个想法是,如果在我必须执行的任何更新/插入中出现故障,那么我可以回滚所有内容,但我的印象是我需要进行提交。
起初我打算在 ado.net 中执行此操作,但后来切换到存储过程,因为我认为这可能会解决此问题。
在这种情况下,SP会帮助我吗?
是的,scope_identity会给你最新插入的 id。或者,如果您使用的是 sql Server 2005+,则可以使用输出子句。
INSERT INTO [MyTable]([MyCol])
OUTPUT INSERTED.ID
SELECT [MyCol] FROM [MySourceTable];
怎么样:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.YourFirstTable(.....)
VALUES(.......)
DECLARE @newID INT
SELECT @newID = SCOPE_IDENTITY()
INSERT INTO dbo.YourSecondTable(ID, .......)
VALUES(@newID, ........)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
ROLLBACK TRANSACTION
END CATCH
应该适用于任何版本的 SQL Server 2005 或更高版本。
仅仅通过获取SCOPE_IDENTITY()
值,您绝对不会"破坏"交易......例如,将其包装到存储过程中,或者只是从调用代码中调用它。