【问题标题】:How to insert auto increment value in temporary table in SQL如何在 SQL 中的临时表中插入自动增量值
【发布时间】:2017-02-06 11:23:47
【问题描述】:

我有一个存储过程,我从用户界面接收序列号。存储过程将从表中选择记录并将它们插入到一个临时表中,该表的结构与原始表相同,除了一个额外的列。

此列将包含值“序列号 + 1”。对于连续插入,此值将自动增加。我该怎么做?我要保留自动递增值的列名是“REV_SEQ”

  ALTER PROCEDURE [PCC_APP_OWN].[Doc_GetBlChargePatternData] 
      @RevSeq INT NULL = 0,
      @TotalCount INT OUTPUT
  AS
  BEGIN
      DECLARE @DscgPort VARCHAR(7);
      DECLARE @tempRowId INT; 
      DECLARE @tempRevSeq INT; 

      SET @tempRevSeq = @RevSeq + 1;

      DECLARE @TempMenuResult AS TABLE (REV_SEQ INT,
                                        CHRG_PTRN_DTL_ID INT,
                                        UPDT_STAMP DATETIME,
                                        UPDT_USER VARCHAR(12),
                                        ORGL_STAMP DATETIME,
                                        ORGL_USER VARCHAR(12),
                                        DEL_FLG VARCHAR(1),
                                        CHRG_PTRN_HDR_ID INT,
                                        SEQ INT,
                                        CHRG_CODE VARCHAR(3),
                                        PORT_CODE VARCHAR(7),   
                                        BASIS VARCHAR(2),
                                        UM VARCHAR(2),
                                        RATE DECIMAL(8,2),
                                        CURRENCY VARCHAR(3),
                                        PER VARCHAR(2),
                                        PREPAID_COLLECT VARCHAR(1),
                                        INV_OFC VARCHAR(6)
                                       );   

    SELECT @DscgPort = DSCH_PORT 
    FROM BL 
    WHERE BL_NO_UID = 1 AND CA_SEQ = 0;

    INSERT INTO @TempMenuResult (REV_SEQ, CHRG_PTRN_DTL_ID, UPDT_STAMP, UPDT_USER, ORGL_STAMP, ORGL_USER, DEL_FLG, CHRG_PTRN_HDR_ID, SEQ, CHRG_CODE, PORT_CODE, BASIS, UM, RATE, CURRENCY, PER, PREPAID_COLLECT, INV_OFC)
        SELECT 
            IDENTITY(INT, @RevSeq, 1) AS id, * 
        FROM 
            CHRG_PTRN_DTL CHG_1 
        WHERE 
            CHG_1.CHRG_PTRN_HDR_ID = @ChargePtrnHdrId 
            AND CHG_1.PORT_CODE = @DscgPort 
            AND CHG_1.DEL_FLG = 'N'

        UNION

        SELECT 
            IDENTITY(INT, @RevSeq, 1) AS id, * 
        FROM 
            CHRG_PTRN_DTL CHG_2 
        WHERE 
            CHG_2.PORT_CODE IS NULL 
            AND CHG_2.DEL_FLG = 'N';

    SELECT @TotalCount = COUNT(1) OVER () FROM @TempMenuResult;
    SELECT * FROM @TempMenuResult ORDER BY REV_SEQ;
END

【问题讨论】:

  • 标记您正在使用的 dbms。 (该代码是特定于产品的。)
  • 那个 SQL Server 2016
  • 尝试,当您创建列 REV_SEQ INT Identity (RevSeq,1) 并且不向其中插入任何内容时...因此它将从参数中的 RevSeq 编号开始,并继续每增加 1条目,与 RevSeq + 1, 1 一起使用 ... 取决于您希望它从哪个数字开始,然后从其他查询中删除插入该列

标签: sql stored-procedures row identity sql-server-2016


【解决方案1】:

我认为通过将列声明为identity 来更容易做到这一点:

DECLARE @TempMenuResult AS TABLE (REV_SEQ INT IDENTITY, . . .);

. . .

INSERT INTO @TempMenuResult (CHRG_PTRN_DTL_ID, UPDT_STAMP, UPDT_USER, ORGL_STAMP, ORGL_USER, DEL_FLG, CHRG_PTRN_HDR_ID, SEQ, CHRG_CODE, PORT_CODE, BASIS, UM, RATE, CURRENCY, PER, PREPAID_COLLECT, INV_OFC)
    SELECT *
    . . .;

那么你有这样的说法:

SELECT @TotalCount = COUNT(1) OVER () FROM @TempMenuResult;

Tis 可能不会做你想做的事。您想要简单的聚合,而不是窗口函数:

SELECT @TotalCount = COUNT(*) FROM @TempMenuResult;

【讨论】:

    【解决方案2】:

    动态标识种子不能使用表变量。请改用临时表。如下修改您的表创建。

        DECLARE @sql varchar(8000);
        SET @sql = 'DROP TABLE ##TempMenuResult; CREATE TABLE ##TempMenuResult (REV_SEQ INT IDENTITY('+ CAST(@tempRevSeq AS varchar(15)) + ', 1) NOT NULL ,
                                                CHRG_PTRN_DTL_ID INT,
                                                UPDT_STAMP DATETIME,
                                                UPDT_USER VARCHAR(12),
                                                ORGL_STAMP DATETIME,
                                                ORGL_USER VARCHAR(12),
                                                DEL_FLG VARCHAR(1),
                                                CHRG_PTRN_HDR_ID INT,
                                                SEQ INT,
                                                CHRG_CODE VARCHAR(3),
                                                PORT_CODE VARCHAR(7),   
                                                BASIS VARCHAR(2),
                                                UM VARCHAR(2),
                                                RATE DECIMAL(8,2),
                                                CURRENCY VARCHAR(3),
                                                PER VARCHAR(2),
                                                PREPAID_COLLECT VARCHAR(1),
                                                INV_OFC VARCHAR(6)
                                               );'
        EXEC (@sql);
        --Your code here to further process ##TempMenuResult
    

    编辑:我没有你的数据库,但这可以修改 SP

    ALTER PROCEDURE [PCC_APP_OWN].[Doc_GetBlChargePatternData] 
          @RevSeq INT NULL = 0,
          @TotalCount INT OUTPUT
      AS
      BEGIN
          DECLARE @DscgPort VARCHAR(7);
          DECLARE @tempRowId INT; 
          DECLARE @tempRevSeq INT; 
    
          SET @tempRevSeq = @RevSeq + 1;
    
          DECLARE @sql varchar(8000);
            SET @sql = 'DROP TABLE ##TempMenuResult; CREATE TABLE ##TempMenuResult (REV_SEQ INT IDENTITY('+ CAST(@tempRevSeq AS varchar(15)) + ', 1) NOT NULL ,
                                                CHRG_PTRN_DTL_ID INT,
                                                UPDT_STAMP DATETIME,
                                                UPDT_USER VARCHAR(12),
                                                ORGL_STAMP DATETIME,
                                                ORGL_USER VARCHAR(12),
                                                DEL_FLG VARCHAR(1),
                                                CHRG_PTRN_HDR_ID INT,
                                                SEQ INT,
                                                CHRG_CODE VARCHAR(3),
                                                PORT_CODE VARCHAR(7),   
                                                BASIS VARCHAR(2),
                                                UM VARCHAR(2),
                                                RATE DECIMAL(8,2),
                                                CURRENCY VARCHAR(3),
                                                PER VARCHAR(2),
                                                PREPAID_COLLECT VARCHAR(1),
                                                INV_OFC VARCHAR(6)
                                               );'
        EXEC (@sql);
    
        SELECT @DscgPort = DSCH_PORT 
        FROM BL 
        WHERE BL_NO_UID = 1 AND CA_SEQ = 0;
    
        INSERT INTO #TempMenuResult (CHRG_PTRN_DTL_ID, UPDT_STAMP, UPDT_USER, ORGL_STAMP, ORGL_USER, DEL_FLG, CHRG_PTRN_HDR_ID, SEQ, CHRG_CODE, PORT_CODE, BASIS, UM, RATE, CURRENCY, PER, PREPAID_COLLECT, INV_OFC)
            SELECT 
                * 
            FROM 
                CHRG_PTRN_DTL CHG_1 
            WHERE 
                CHG_1.CHRG_PTRN_HDR_ID = @ChargePtrnHdrId 
                AND CHG_1.PORT_CODE = @DscgPort 
                AND CHG_1.DEL_FLG = 'N'
    
            UNION
    
            SELECT 
                * 
            FROM 
                CHRG_PTRN_DTL CHG_2 
            WHERE 
                CHG_2.PORT_CODE IS NULL 
                AND CHG_2.DEL_FLG = 'N';
    
        SELECT @TotalCount = COUNT(1) OVER () FROM #TempMenuResult;
        SELECT * FROM #TempMenuResult ORDER BY REV_SEQ;
    END
    

    编辑:如果您不想使用动态 sql,请使用 DBCC CHECKIDENT 来 RESEED。

    ALTER PROCEDURE [PCC_APP_OWN].[Doc_GetBlChargePatternData] 
          @RevSeq INT NULL = 0,
          @TotalCount INT OUTPUT
      AS
      BEGIN
          DECLARE @DscgPort VARCHAR(7);
          DECLARE @tempRowId INT; 
          DECLARE @tempRevSeq INT; 
    
          SET @tempRevSeq = @RevSeq + 1;
    
    
          DROP TABLE ##TempMenuResult; 
          CREATE TABLE ##TempMenuResult (REV_SEQ INT IDENTITY(1, 1) NOT NULL ,
                                                CHRG_PTRN_DTL_ID INT,
                                                UPDT_STAMP DATETIME,
                                                UPDT_USER VARCHAR(12),
                                                ORGL_STAMP DATETIME,
                                                ORGL_USER VARCHAR(12),
                                                DEL_FLG VARCHAR(1),
                                                CHRG_PTRN_HDR_ID INT,
                                                SEQ INT,
                                                CHRG_CODE VARCHAR(3),
                                                PORT_CODE VARCHAR(7),   
                                                BASIS VARCHAR(2),
                                                UM VARCHAR(2),
                                                RATE DECIMAL(8,2),
                                                CURRENCY VARCHAR(3),
                                                PER VARCHAR(2),
                                                PREPAID_COLLECT VARCHAR(1),
                                                INV_OFC VARCHAR(6)
                                               );
    
        DBCC CHECKIDENT (##TempMenuResult, reseed, @tempRevSeq)
    
        SELECT @DscgPort = DSCH_PORT 
        FROM BL 
        WHERE BL_NO_UID = 1 AND CA_SEQ = 0;
    
        INSERT INTO #TempMenuResult (CHRG_PTRN_DTL_ID, UPDT_STAMP, UPDT_USER, ORGL_STAMP, ORGL_USER, DEL_FLG, CHRG_PTRN_HDR_ID, SEQ, CHRG_CODE, PORT_CODE, BASIS, UM, RATE, CURRENCY, PER, PREPAID_COLLECT, INV_OFC)
            SELECT 
                * 
            FROM 
                CHRG_PTRN_DTL CHG_1 
            WHERE 
                CHG_1.CHRG_PTRN_HDR_ID = @ChargePtrnHdrId 
                AND CHG_1.PORT_CODE = @DscgPort 
                AND CHG_1.DEL_FLG = 'N'
    
            UNION
    
            SELECT 
                * 
            FROM 
                CHRG_PTRN_DTL CHG_2 
            WHERE 
                CHG_2.PORT_CODE IS NULL 
                AND CHG_2.DEL_FLG = 'N';
    
        SELECT @TotalCount = COUNT(1) OVER () FROM #TempMenuResult;
        SELECT * FROM #TempMenuResult ORDER BY REV_SEQ;
    END
    

    【讨论】:

    • 必须声明表变量“@TempMenuResult”。这是我在实现您的代码后遇到的错误。错误发生在执行 INSERT 语句时
    • 将@TempMenuResult 更改为#TempMenuResult。在您进一步的 SP 代码中。
    • 第一次执行成功返回结果。但在下次执行时,它会给出错误“数据库中已经有一个名为'#TempMenuResult'的对象。”
    • 错过了...已编辑以包含 DROP TABLE ##TempMenuResult;在查询中
    • 如果我不使用动态 sql,你能告诉我创建临时表的语法是什么吗?更准确地说,我需要标识列的语法,即 CREATE TABLE ##TempMenuResult (REV_SEQ INT IDENTITY('+ CAST(@tempRevSeq AS varchar(15)) + ', 1) NOT NULL 因为不接受单引号
    猜你喜欢
    • 2012-04-28
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多