Увеличение RECORD_ID при добавлении записей с использованием триггера - PullRequest
0 голосов
/ 22 мая 2019

Я использую триггер для вставки строк в таблицу, используя инструкцию INSERT, как показано ниже, но при этом число RECORD_ID увеличивается на 1 цифру, поэтому все вставленные записи имеют одинаковое число ..

Это то, что я использую для увеличения записей из триггера.

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

Это то, что я использую для загрузки данных

;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  

Любые исправления приветствуются Спасибо,

Полное описание проблемы доступно здесь: T-SQL: создать триггер для копирования новых столбцов из одной таблицы в другую с шагом №

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Сделайте PROGRESS-RECID столбцом IDENTITY , и он будет автоматически увеличен.

0 голосов
/ 23 мая 2019

Исходя из связанного вопроса, вы можете переписать свой триггер следующим образом:

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;

Корень вашей проблемы :

Когда вы используете INSERT INTO ... SELECT (Один вне триггера), триггер будет вызван один раз, а таблица inserted будет содержать все записи, которые будут вставлены.поэтому запрос внутри триггера будет выполнен один раз, кроме того, SELECT MAX([PROGRESS-RECID]) будет вычислен один раз.Это означает, что если вставленная таблица содержит 10 записей, которые вставляются, то MAX(...) будет одинаковым для всех из них!

Как я это решил:

Внутри триггера я использовал Cursor, чтобы перебрать все вставляемые записи (например, 10 записей), затем в каждой итерации я вставляю одну запись в ReTncyTransStatement, поэтому MAX(...) будет вычисляться и выполняться, как ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...