INSERT - SELECT с автоматическим увеличением даты и времени для каждой вставленной строки - PullRequest
0 голосов
/ 29 марта 2019

У меня есть таблица с 3 ключами, AUDIT_OPRID (varchar), AUDIT_STAMP (datetime), AUDIT_ACTN (varchar).

Я вставляю строкииз оператора выбора, используя функцию GETDATE(), чтобы получить текущую дату и время.Значения AUDIT_OPRID и AUDIT_ACTN совпадают, поэтому единственный ключевой столбец, который я могу сделать уникальным, - это datetime.Я надеялся, что есть способ автоматически увеличивать дату и время на 1 секунду для каждой вставленной строки, чтобы у меня не возникало проблем с дублированием ключа.

Я нашел поток для версии MySQL аналогичной ситуации - SQL INSERT ... SELECT с автоинкрементом DATETIME однако я получаю синтаксические ошибки при использовании этого в следующем SQL:

DECLARE @value DATETIME
SET @value = CURRENT_TIMESTAMP

INSERT INTO PS_AUDIT_PSROLEUSR (AUDIT_OPRID, AUDIT_STAMP, AUDIT_ACTN, ROLEUSER, ROLENAME, DYNAMIC_SW)
    SELECT  
        'TESTUSER', @value = @value + INTERVAL 1 SECOND, 'D', A.OPRID, D.ROLENAME, 'N'
    FROM 
        PSOPRDEFN A
    INNER JOIN 
        PS_AD_X_WALK B ON B.OPRID = A.OPRID
    INNER JOIN 
        PS_JOB C ON C.EMPLID = B.GH_AD_EMPLID
    WHERE 
        B.GH_AD_EMPLID <> ''
        AND C.ACTION = 'TER'
        AND A.ACCTLOCK = 0

Идеальный результат будет следующим:

AUDIT_OPRID    AUDIT_STAMP               AUDIT_ACTN    ROLEUSER         ROLENAME            DYNAMIC_SW
TESTUSER       2018-11-21 07:02:08.563   D             USER123452       GHS_PO_RECEIVER     N
TESTUSER       2018-11-21 07:02:09.563   D             USER123452       GHS_STOREROOM       N
TESTUSER       2018-11-21 07:02:10.563   D             USER123452       GH_EPRO             N

1 Ответ

1 голос
/ 29 марта 2019

Вы можете использовать row_number и добавить это значение в виде секунд к значению вашей временной метки, например:

DECLARE @value DATETIME
SET @value = CURRENT_TIMESTAMP

INSERT INTO PS_AUDIT_PSROLEUSR (AUDIT_OPRID, AUDIT_STAMP, AUDIT_ACTN, ROLEUSER, ROLENAME, DYNAMIC_SW)
    SELECT  
        'TESTUSER', DATEADD(SECOND, ROW_NUMBER() OVER (ORDER BY A.OPRID), @value),
        'D', A.OPRID, D.ROLENAME, 'N'
    FROM 
        PSOPRDEFN A
    INNER JOIN 
        PS_AD_X_WALK B ON B.OPRID = A.OPRID
    INNER JOIN 
        PS_JOB C ON C.EMPLID = B.GH_AD_EMPLID
    WHERE 
        B.GH_AD_EMPLID <> ''
        AND C.ACTION = 'TER'
        AND A.ACCTLOCK = 0
...