首页 > 解决方案 > INSERT - 为插入的每一行自动增加日期时间的 SELECT

问题描述

我有一张桌子,上面有 3 个键,AUDIT_OPRID( varchar)、AUDIT_STAMP( datetime)、AUDIT_ACTN( varchar)。

我正在从 select 语句中插入行,使用该GETDATE()函数获取当前日期时间。AUDIT_OPRID和的值AUDIT_ACTN是相同的,所以我唯一可以使唯一的键列是日期时间。我希望有一种方法可以为插入的每一行自动增加 1 秒的日期时间,这样我就不会遇到重复的键问题。

我找到了一个类似情况的 MySQL 版本的线程 - SQL INSERT...SELECT with auto-increment 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

标签: sqlsql-server-2014

解决方案


您可以使用 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

推荐阅读