Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将新记录插入自动编号表,然后在另一个表中使用自动编号_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 将新记录插入自动编号表,然后在另一个表中使用自动编号

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_

我正在编写一个存储过程,将表单中的数据插入到两个表中。一个表具有自动编号的标识字段。我需要将数据插入该表,找到新创建的自动编号,然后使用该编号将数据插入另一个表。因此,归结起来,我在两个表之间有一个一对多的链接,我需要确保插入identity字段

这段代码是做类似事情的最佳方式,还是我遗漏了一些明显的东西

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,所以我想这就是我发现自己更多地使用它的原因。