Incrementing RECORD_ID When insterting records using a trigger

戏子无情 提交于 2020-01-25 07:01:06

问题


I am using a trigger to insert rows into a table using INSERT statement as below but when doing this the RECORD_ID number increments by 1 digit so all the records inserted have the same number..

This is what i'm using to increment the records from the trigger.

, ISNULL((
               SELECT MAX([PROGRESS-RECID]) FROM [DBAdmin].[dbo].[ReTncyTransStatement]
           ),0) + 1 AS [PROGRESS-RECID]

This is what i'm using to load the data

;WITH TestTrans   (
       [ORG-CODE]
      ,[TNCY-SYS-REF]
      ,[TRANS-NO]
      ,[POSTING-YEAR]
      ,[POSTING-WEEK]
      ,[TRANS-YEAR]
      ,[TRANS-WEEK]
      ,[TRANS-DATE]
      ,[ACCOUNT-TYPE]
      ,[ACCOUNT-CODE]
      ,[COMMENT]
      ,[TRANS-AMT]
      ,[SOURCE]
      ,[CREATED-USER]
      ,[CREATED-DATE]
      ,[CREATED-TIME]
      ,[UPDATED-USER]
      ,[UPDATED-DATE]
      ,[UPDATED-TIME]
      ,[BATCH-NO]
      ,[BATCH-NO-TYPE]
      ,[SUSPENSE-REF]
      ,[REFERENCE]
      ,[MGT-AREA]
      ,[ANALYSIS-CODE]
      ) 
AS (SELECT   
       [ORG-CODE]
      ,[TNCY-SYS-REF]
      ,[TRANS-NO]
      ,[POSTING-YEAR]
      ,[POSTING-WEEK]
      ,[TRANS-YEAR]
      ,[TRANS-WEEK]
      ,[TRANS-DATE]
      ,[ACCOUNT-TYPE]
      ,[ACCOUNT-CODE]
      ,[COMMENT]
      ,[TRANS-AMT]
      ,[SOURCE]
      ,[CREATED-USER]
      ,[CREATED-DATE]
      ,[CREATED-TIME]
      ,[UPDATED-USER]
      ,[UPDATED-DATE]
      ,[UPDATED-TIME]
      ,[BATCH-NO]
      ,[BATCH-NO-TYPE]
      ,[SUSPENSE-REF]
      ,[REFERENCE]
      ,[MGT-AREA]
      ,[ANALYSIS-CODE] from [SQLViewsPro2Live].[dbo].[RE-TNCY-TRANS] where [TRANS-DATE] between '2019-05-16 00:00:00.000' and '2019-05-17 00:00:00.000'
      )    
INSERT INTO [SQLViewsPro2Test].[dbo].[RE-TNCY-TRANS]   
    SELECT 

     [ORG-CODE]
      ,[TNCY-SYS-REF]
      ,[TRANS-NO]
      ,[POSTING-YEAR]
      ,[POSTING-WEEK]
      ,[TRANS-YEAR]
      ,[TRANS-WEEK]
      ,[TRANS-DATE]
      ,[ACCOUNT-TYPE]
      ,[ACCOUNT-CODE]
      ,[COMMENT]
      ,[TRANS-AMT]
      ,[SOURCE]
      ,[CREATED-USER]
      ,[CREATED-DATE]
      ,[CREATED-TIME]
      ,[UPDATED-USER]
      ,[UPDATED-DATE]
      ,[UPDATED-TIME]
      ,[BATCH-NO]
      ,[BATCH-NO-TYPE]
      ,[SUSPENSE-REF]
      ,[REFERENCE]
      ,[MGT-AREA]
      ,[ANALYSIS-CODE]
   FROM TestTrans;  
GO  

Any fixes appreciated Thanks,

Full description of problem available here: T-SQL : create trigger to copy new columns from one table to another and increment no


回答1:


Make PROGRESS-RECID an IDENTITY column and it will auto-increment.




回答2:


Based on the linked question, you can rewrite your trigger as following:

CREATE TRIGGER AddReTncyTransStatement
ON [SQLViewsPro2EOD].[dbo].[RE-TNCY-TRANS]
AFTER UPDATE, INSERT
AS
BEGIN

    DECLARE @ORG_CODE INT,
            @TNCY_SYS_REF INT,
            @TRANS_NO INT;
    DECLARE C CURSOR FAST_FORWARD FOR(
    SELECT Inserted.[ORG-CODE],
           Inserted.[TNCY-SYS-REF],
           Inserted.[TRANS-NO]
    FROM Inserted);
    OPEN C;
    FETCH NEXT FROM C
    INTO @ORG_CODE,
         @TNCY_SYS_REF,
         @TRANS_NO;
    WHILE @@FETCH_STATUS = 0
    BEGIN

        INSERT INTO [DBAdmin].[dbo].[ReTncyTransStatement]
        (
            [ORG-CODE],
            [TNCY-SYS-REF],
            [TRANS-NO],
            [PROGRESS-RECID]
        )
        SELECT 
               @ORG_CODE,
               @TNCY_SYS_REF,
               @TRANS_NO,
               ISNULL((SELECT MAX([PROGRESS-RECID]) FROM [DBAdmin].[dbo].[ReTncyTransStatement]),0) + 1 AS RECID;

        FETCH NEXT FROM C
        INTO @ORG_CODE,
             @TNCY_SYS_REF,
             @TRANS_NO

    END;
    CLOSE C;
    DEALLOCATE C;

END;

Root of your problem:

When you use INSERT INTO ... SELECT(The one outside the trigger), trigger will be called once and the inserted table will contain all the records to be inserted. so the query inside the trigger will be run once, furthermore the SELECT MAX([PROGRESS-RECID]) will be calculated once. This means that if the inserted table contains 10 records, that are being inserted, then MAX(...) will be same for all of them!

How I Solved it:

Inside the trigger I used Cursor to iterate through the all records that are being inserted(For example 10 records), then in each iteration I insert one record to ReTncyTransStatement so the MAX(...) will be calculated and executed as expected.



来源:https://stackoverflow.com/questions/56258176/incrementing-record-id-when-insterting-records-using-a-trigger

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!