2017-02-06 9 views
1

У меня есть хранимая процедура, в которой я получаю порядковый номер из пользовательского интерфейса. Хранимая процедура будет выбирать записи из таблицы и вставлять их во временную таблицу, структура которой аналогична исходной таблице, за исключением дополнительного столбца.Как вставить значение автоматического прироста во временную таблицу в SQL

В этом столбце будет указано значение «Номер последовательности + 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 
+1

Тег dbms, который вы используете. (Этот код специфичен для продукта.) – jarlh

+0

, что SQL Server 2016 –

+0

попытайтесь при создании столбца REV_SEQ INT Identity (RevSeq, 1) и не вставляйте в него ничего ... поэтому он начнется с вашего номера RevSeq из параметра и продолжайте увеличиваться на 1 для каждой записи, перейдите с RevSeq + 1, 1 ... зависит от того, с какого числа вы хотите начать, после этого удалите вставку в этот столбец из другого запроса – Veljko89

ответ

0

Семена динамической идентификации невозможны с переменными таблиц. Вместо этого используйте таблицы Temp. Измените создание таблицы, как показано ниже.

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: я не ваш 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

Я думаю, что это легче сделать это, просто объявив столбец быть 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; 

Возможно, вы не будете делать то, что хотите. Вы хотите простое агрегатирование, а не функцию окна:

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