2017-02-06 5 views
1

einfügen Ich habe eine gespeicherte Prozedur, wo ich eine Sequenznummer von der Benutzeroberfläche empfangen. Die gespeicherte Prozedur wählt Datensätze aus einer Tabelle aus und fügt sie in eine temporäre Tabelle ein, deren Struktur der ursprünglichen Tabelle entspricht, mit Ausnahme einer zusätzlichen Spalte.Wie Auto-Inkrement-Wert in temporäre Tabelle in SQL

Diese Spalte enthält den Wert "Sequence Number + 1". Bei aufeinanderfolgenden Einfügungen wird dieser Wert automatisch erhöht. Wie soll ich das machen? Der Spaltenname, wo ich das Auto erhöhte Wert halten wollen, ist „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

Markieren Sie die von Ihnen verwendeten dbms. (Dieser Code ist produktspezifisch.) – jarlh

+0

, dass SQL Server 2016 –

+0

versuchen, wenn Sie Spalte REV_SEQ INT-Identität (RevSeq, 1) erstellen und nichts darin einfügen ... so wird es von Ihrer RevSeq-Nummer von Parameter und starten fortfahren um 1 für jeden Eintrag zu erhöhen, mit RevSeq + 1, 1 zu gehen ... hängt davon ab, welche Nummer Sie starten möchten, danach Einfügen in diese Spalte von anderer Abfrage entfernen – Veljko89

Antwort

0

Dynamic Identity-Seeds sind nicht mit Tabellenvariablen möglich. Verwenden Sie stattdessen Temp-Tabellen. Ändern Sie Ihre Tabellenerstellung wie folgt.

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: Ich glaube nicht, Ihre DB haben, aber dies SP könnte

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 geändert: Wenn Sie die dynamische SQL nicht verwenden möchten, verwenden Sie DBCC CHECK 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 
+0

Muss die Tabellenvariable "@TempMenuResult" deklarieren. Dies ist der Fehler, den ich nach der Implementierung Ihres Codes erhalte. Der Fehler tritt bei der Ausführung der INSERT-Anweisung auf. –

+0

Ändern Sie @TempMenuResult in #TempMenuResult. in Ihrem weiteren SP-Code. –

+0

Die Ergebnisse werden bei der ersten Ausführung erfolgreich zurückgegeben. Aber bei der nächsten Ausführung gibt es einen Fehler "Es gibt bereits ein Objekt mit dem Namen '#TempMenuResult' in der Datenbank." –

1

Ich denke, dass es einfacher ist, dies zu tun, indem Sie einfach die Spalte erklärt identity zu sein:

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 * 
    . . .; 

Dann haben Sie diese Aussage:

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

Tis wird wahrscheinlich nicht tun, was Sie wollen. Sie möchten einfache Aggregation, keine Fensterfunktion:

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