Sql 将新记录插入自动编号表,然后在另一个表中使用自动编号
我正在编写一个存储过程,将表单中的数据插入到两个表中。一个表具有自动编号的标识字段。我需要将数据插入该表,找到新创建的自动编号,然后使用该编号将数据插入另一个表。因此,归结起来,我在两个表之间有一个一对多的链接,我需要确保插入identity字段 这段代码是做类似事情的最佳方式,还是我遗漏了一些明显的东西Sql 将新记录插入自动编号表,然后在另一个表中使用自动编号,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在编写一个存储过程,将表单中的数据插入到两个表中。一个表具有自动编号的标识字段。我需要将数据插入该表,找到新创建的自动编号,然后使用该编号将数据插入另一个表。因此,归结起来,我在两个表之间有一个一对多的链接,我需要确保插入identity字段 这段代码是做类似事情的最佳方式,还是我遗漏了一些明显的东西 CREATE PROCEDURE [dbo].[sp_Insert_CRT] ( @TRACKING_ID int, @CUST_NUM int, @TRACKING_
CREATE PROCEDURE [dbo].[sp_Insert_CRT]
(
@TRACKING_ID int,
@CUST_NUM int,
@TRACKING_ITEM_ID int,
@STATEMENT_NUM nvarchar (200) = null,
@AMOUNT numeric (15, 2),
@BBL_ADJUSTED int = NULL,
@PAID_VS_BILLED int = NULL,
@ADJUSTMENT_TYPE int = NULL,
@ENTERED_BY nvarchar (10) = NULL,
@ENTERED_DATE date = NULL,
@AA_STATUS int = NULL
)
AS
BEGIN
-- Insert data into CRT_Main, where Tracking_ID is an autonumber field
INSERT into tbl_CRT_Main
(
-- TRACKING_ID
CUST_NUM
,TRACKING_ITEM_ID
,STATEMENT_NUM
,AMOUNT
)
VALUES
(
-- @TRACKING_ID
@CUST_NUM
,@TRACKING_ITEM_ID
,@STATEMENT_NUM
,@AMOUNT
)
-- Find the newly generated autonumber, and use it in another table
BEGIN TRANSACTION
DECLARE @TrackID int;
SELECT @TrackID = coalesce((select max(TRACKING_ID) from tbl_CRT_Main), 1)
COMMIT
INSERT into tbl_CRT_Admin_Adjustment
(
TRACKING_ID
,BBL_ADJUSTED
,PAID_VS_BILLED
,[ADJUSTMENT_TYPE]
,[ENTERED_BY]
,[ENTERED_DATE]
,AA_STATUS
)
VALUES
(
@TrackID
,@BBL_ADJUSTED
,@PAID_VS_BILLED
,@ADJUSTMENT_TYPE
,@ENTERED_BY
,@ENTERED_DATE
,@AA_STATUS
)
END
选择@TrackID=coaleschect从tbl\U CRT\U Main中选择maxTRACKING\U ID,1
不,不要这样做。这将获得跟踪ID的最大值是的,但这并不意味着这就是为插入创建的值。如果多个INSERT语句由不同的连接运行,则很可能会得到错误的值
相反,使用SCOPE_IDENTITY获取值:
SET @TrackID = SCOPE_IDENTITY();
此外,不需要像使用SELECT MAX那样将上述内容封装在显式事务中。相反,过程中的整个批处理很可能位于自己的显式事务中,并带有一个TRY…CATCH,以便在发生错误时可以回滚整个批处理。FYI,不要将sp_uuu用作对象的前缀。它由Microsoft保留,用于特殊程序。它的使用会带来性能损失,可能会导致您的过程在更新后的第二天无法工作。就个人而言,不必费心尝试/捕获/回滚,它可能会变得非常混乱,初学者很难编写。只需将XACT_ABORT设置为ON;“交易应该是足够的,也许只有我一个人,@Charlieface,但我并不认为尝试……捕捉是混乱或难以理解的;即使是对这种语言相当陌生的人。与其他操作不同,它的工作原理非常类似于编程语言try…catch语法,人们经常会接触到它。try/catch/if trancount。。。回滚/选择错误\u消息。。。对于我来说,唯一的好处就是实现服务器端日志记录,而我很少这样做。XACT_ABORT会自动回滚所有内容,同时执行try/catch有什么好处?我经常发现我抛出了定制错误,@Charlieface,所以我想这就是我发现自己更多地使用它的原因。