如何在SQL中的临时表中插入自动增量值

如何在SQL中的临时表中插入自动增量值,sql,stored-procedures,row,identity,sql-server-2016,Sql,Stored Procedures,Row,Identity,Sql Server 2016,我有一个存储过程,从用户界面接收序列号。存储过程将从表中选择记录,并将其插入临时表中,该临时表的结构与原始表相同,只是增加了一列 此列将保存值序列号+1。对于连续插入,该值将自动递增。我该怎么做?我希望保留自动递增值的列名是REV_SEQ ALTER PROCEDURE [PCC_APP_OWN].[Doc_GetBlChargePatternData] @RevSeq INT NULL = 0, @TotalCount INT OUTPUT AS BEGI

我有一个存储过程,从用户界面接收序列号。存储过程将从表中选择记录,并将其插入临时表中,该临时表的结构与原始表相同,只是增加了一列

此列将保存值序列号+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

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

那么你有这样的说法:

SELECT @TotalCount = COUNT(1) OVER () FROM @TempMenuResult;
它可能不会做你想做的事。您需要的是简单的聚合,而不是窗口函数:

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

对于表变量,动态标识种子是不可能的。使用临时表代替。如下所示修改表的创建

    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
编辑:我没有你的数据库,但这可以修改

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重新设定种子

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

标记您正在使用的dbms。该代码是特定于产品的。SQL Server 2016尝试在创建列REV_SEQ INT Identity RevSeq,1时,不在其中插入任何内容。。。所以它将从参数中的RevSeq数开始,并继续为每个条目增加1,即使用RevSeq+1,1。。。取决于要从哪个数字开始,然后从其他查询中删除插入到该列中必须声明表变量@TempMenuResult。这就是我在实现代码后遇到的错误。。执行INSERT语句时出错将@TempMenuResult更改为TempMenuResult。在进一步的SP代码中。它在第一次执行时成功返回结果。但在下一次执行时,它给出了一个错误,数据库中已经有一个名为“TempMenuResult”的对象。没有找到它。。。编辑以包括DROP TABLE TempMenuResult;在查询中,您可以告诉我如果不使用动态sql,创建临时表的语法是什么。更准确地说,我需要标识列的语法,即创建表TempMenuResult REV_SEQ INT identity'+CAST@tempRevSeq作为varchar15+',1不能为NULL,因为不接受单引号
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