2017-02-06 1 views
1

J'ai une procédure stockée dans laquelle je reçois un numéro de séquence de l'interface utilisateur. La procédure stockée sélectionne les enregistrements d'une table et les insère dans une table temporaire dont la structure est la même que la table d'origine, à l'exception d'une colonne supplémentaire.Comment insérer une valeur d'incrémentation automatique dans une table temporaire dans SQL

Cette colonne contiendra la valeur "numéro de séquence + 1". Et pour les insertions successives, cette valeur s'incrémentera automatiquement. Comment dois-je faire cela? Le nom de la colonne où je veux garder la valeur incrémentée automatique est « 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 
+1

Marquez les dbms que vous utilisez. (Ce code est spécifique au produit.) – jarlh

+0

que SQL Server 2016 –

+0

essayez, lorsque vous créez la colonne REV_SEQ INT Identity (RevSeq, 1) et n'y insérez rien ... donc il commencera à partir de votre numéro RevSeq à partir du paramètre et continuer à augmenter de 1 pour chaque entrée, d'aller avec RevSeq + 1, 1 ... dépend du nombre que vous voulez qu'il démarre, après cela supprimer l'insertion dans cette colonne de l'autre requête – Veljko89

Répondre

0

Les variables d'identité dynamique ne sont pas possibles avec les variables de table. Utilisez les tables Temp à la place. Modifiez la création de votre table comme ci-dessous.

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 

Edit: Je n'ai pas votre DB, mais cela pourrait être modifié 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 

EDIT: Si vous ne souhaitez pas utiliser SQL dynamique, utilisez DBCC CHECKIDENT réensemencer.

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 
+0

Doit déclarer la variable de table "@TempMenuResult". C'est l'erreur que j'obtiens après l'implémentation de votre code. L'erreur se produit à l'exécution de l'instruction INSERT. –

+0

Modifiez @TempMenuResult à #TempMenuResult. dans votre code SP supplémentaire. –

+0

Il renvoie les résultats avec succès lors de la première exécution. Mais à la prochaine exécution, il donne une erreur "Il y a déjà un objet nommé '#TempMenuResult' dans la base de données." –

1

Je pense qu'il est plus facile de le faire en tout déclarant la colonne à 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 * 
    . . .; 

Ensuite, vous avez cette déclaration:

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

Cela ne fera probablement pas ce que vous voulez. Vous voulez une agrégation simple, pas une fonction de fenêtre:

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