2017-02-06 13 views
1

私はユーザーインターフェイスからシーケンス番号を受け取っているストアドプロシージャを持っています。ストアドプロシージャは、テーブルからレコードを選択し、追加の列を除いて元のテーブルと同じ構造の一時テーブルに挿入します。SQLの一時テーブルに自動インクリメントの値を挿入する方法

この列の値は「シーケンス番号+ 1」になります。連続して挿入する場合、この値は自動的に増加します。私はこれをどのようにするべきですか?そして、あなたが持っている

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

:私は自動インクリメント値を保持したい列名は、私はidentityするだけで列を宣言することにより、これを行うことが容易だと思う「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

使用しているdbmsにタグを付けます。 (そのコードは製品固有です) – jarlh

+0

SQL Server 2016 –

+0

REV_SEQ列ID(RevSeq、1)を作成して何も挿入しないと、パラメータからRevSeq番号から開始されます。 RevSeq + 1、...の実行ごとに1ずつ増え続けます。それを開始したい番号に依存します。その後、他のクエリーからその列に挿入します。 – Veljko89

答えて

0

テーブル変数ではダイナミックIDシードを使用できません。代わりに一時テーブルを使用してください。次のようにテーブルの作成を変更します。

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 

編集:私はあなたのDBを持っていないが、これは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を変更することができます:あなたが再シードする動的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 
+0

テーブル変数 "@TempMenuResult"を宣言しなければなりません。これは、あなたのコードを実装した後に取得したエラーです。エラーはINSERTステートメントの実行時に発生しています –

+0

@TempMenuResultを#TempMenuResultに変更します。あなたのさらなるSPコードで。 –

+0

最初の実行時に正常に結果を返します。しかし、次回の実行時にはエラーが発生します。「データベースにはすでに#TempMenuResultという名前のオブジェクトがあります。 –

1

ですこのステートメント:

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

Tisはおそらくあなたが望むことはしません。

SELECT @TotalCount = COUNT(*) FROM @TempMenuResult; 
関連する問題