Многократная вставка в хранимой процедуре - PullRequest
0 голосов
/ 28 августа 2018

Я чувствую, что это, вероятно, очень простая проблема, но я не могу найти то, что ищу. Я новичок в хранимой процедуре, но я пытаюсь создать хранимую процедуру, чтобы несколько автоматизировать то, что я буду делать каждый год. У меня есть некоторые переменные, затем у меня есть оператор WITH. Я хотел бы использовать таблицу / представление (?), Которое я создал с помощью оператора WITH, чтобы вставить несколько строк в другую таблицу. У меня есть что-то вроде этого:

DECLARE @YEAR INT SET @YEAR = 2018

-- MOD
DECLARE @NA_MOD FLOAT SET @NA_MOD = 0.69;
DECLARE @EA_MOD FLOAT SET @EA_MOD = 0.13;
DECLARE @AP_MOD FLOAT SET @AP_MOD = 0.11;
DECLARE @LA_MOD FLOAT SET @LA_MOD = 0.07;

WITH MODTARGS AS (
SELECT  YearTarg * @NA_MOD 'YTargNA', YearTarg * @EA_MOD 'YTargEA', YearTarg * @AP_MOD 'YTargAP', YearTarg * @LA_MOD 'YTargLA', 
        JanTarg * @NA_MOD 'JanTargNA', JanTarg * @EA_MOD 'JanTargEA', JanTarg * @AP_MOD 'JanTargAP', JanTarg * @LA_MOD 'JanTargLA',
        FebTarg * @NA_MOD 'FebTargNA', FebTarg * @EA_MOD 'FebTargEA', FebTarg * @AP_MOD 'FebTargAP', FebTarg * @LA_MOD 'FebTargLA',
        MarTarg * @NA_MOD 'MarTargNA', MarTarg * @EA_MOD 'MarTargEA', MarTarg * @AP_MOD 'MarTargAP', MarTarg * @LA_MOD 'MarTargLA',
        AprTarg * @NA_MOD 'AprTargNA', AprTarg * @EA_MOD 'AprTargEA', AprTarg * @AP_MOD 'AprTargAP', AprTarg * @LA_MOD 'AprTargLA',
        MayTarg * @NA_MOD 'MayTargNA', MayTarg * @EA_MOD 'MayTargEA', MayTarg * @AP_MOD 'MayTargAP', MayTarg * @LA_MOD 'MayTargLA',
        JunTarg * @NA_MOD 'JunTargNA', JunTarg * @EA_MOD 'JunTargEA', JunTarg * @AP_MOD 'JunTargAP', JunTarg * @LA_MOD 'JunTargLA',
        JulTarg * @NA_MOD 'JulTargNA', JulTarg * @EA_MOD 'JulTargEA', JulTarg * @AP_MOD 'JulTargAP', JulTarg * @LA_MOD 'JulTargLA',
        AugTarg * @NA_MOD 'AugTargNA', AugTarg * @EA_MOD 'AugTargEA', AugTarg * @AP_MOD 'AugTargAP', AugTarg * @LA_MOD 'AugTargLA',
        SepTarg * @NA_MOD 'SepTargNA', SepTarg * @EA_MOD 'SepTargEA', SepTarg * @AP_MOD 'SepTargAP', SepTarg * @LA_MOD 'SepTargLA',
        OctTarg * @NA_MOD 'OctTargNA', OctTarg * @EA_MOD 'OctTargEA', OctTarg * @AP_MOD 'OctTargAP', OctTarg * @LA_MOD 'OctTargLA',
        NovTarg * @NA_MOD 'NovTargNA', NovTarg * @EA_MOD 'NovTargEA', NovTarg * @AP_MOD 'NovTargAP', NovTarg * @LA_MOD 'NovTargLA',
        DecTarg * @NA_MOD 'DecTargNA', DecTarg * @EA_MOD 'DecTargEA', DecTarg * @AP_MOD 'DecTargAP', DecTarg * @LA_MOD 'DecTargLA'
FROM    TRACKINGTABLE1
WHERE   Application = 'MOD'
        AND Year = @YEAR)

-- INSERT NA    
INSERT  INTO TRACKINGTABLE2
SELECT  'MOD', @YEAR, 'NA', YTargNA, JanTargNA, FebTargNA, MarTargNA, AprTargNA, MayTargNA, JunTargNA, JulTargNA,
        AugTargNA, SepTargNA, OctTargNA, NovTargNA, DecTargNA
FROM    MODTARGS

-- INSERT AP
INSERT  INTO TRACKINGTABLE2
SELECT  'MOD', @YEAR, 'AP', YTargAP, JanTargAP, FebTargAP, MarTargAP, AprTargAP, MayTargAP, JunTargAP, JulTargAP,
        AugTargAP, SepTargAP, OctTargAP, NovTargAP, DecTargAP
FROM    MODTARGS    

Однако, когда я пытаюсь запустить это, я получаю ошибку "Недопустимое имя объекта MODTARGS" для второй INSERT. Я пробовал различные комбинации использования GO, введения запятой или точки с запятой после первой INSERT, и ничего не получалось. Это возможно? Я делаю действительно простую синтаксическую ошибку?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Добавление GO или ; не имеет смысла, потому что CTE может только сопровождаться SELECT, INSERT, DELETE и использоваться только один раз, что делает вашу 2-ую вставку никогда не работающей.

Возможным решением является удаление из таблицы (DECLARE @T TABLE (...)) или использование таблицы #Temp для хранения ваших данных, а затем вставьте их в нужное вам количество.

0 голосов
/ 28 августа 2018

CTE действителен только для оператора, следующего непосредственно за ним, поэтому во втором INSERT он больше не «известен».

Вместо этого вы можете использовать временную таблицу или табличную переменную.

Но кажется, что вы можете сделать это еще проще, все в одном утверждении, если вы соедините эти 'NA' и 'AP' с CTE.

WITH modtargs AS (
...)
INSERT INTO trackingtable2
SELECT  'MOD',
        @year,
        x.x,
        ma.ytargna,
        ma.jantargna,
        ...
        ma.dectargna
        FROM modtargs ma
             CROSS JOIN (SELECT 'NA' x
                         UNION ALL
                         SELECT 'AP' x) x;

Кстати, желательно явно упомянуть целевые столбцы в INSERT.

...