Множественная вставка в хранимой процедуре
Я чувствую, что это, вероятно, действительно простая проблема, но я не могу найти то, что я ищу. Я новичок в хранимой процедуре, но я пытаюсь создать хранимую процедуру, чтобы несколько автоматизировать то, что я буду делать каждый год. У меня есть некоторые переменные, затем у меня есть оператор 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" для второй вставки. Я пробовал различные комбинации использования GO, введения запятой или точки с запятой после первой INSERT, и ничего не получалось. Это возможно? Я делаю действительно простую синтаксическую ошибку?
2 ответа
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
,
Добавление GO
или же ;
не имеет смысла, потому что CTE
может только сопровождаться SELECT, INSERT, DELETE
и используется только один раз, что делает вашу вторую вставку никогда не работает.
Возможным решением является декольте стола (DECLARE @T TABLE (...)
) или использовать #Temp
таблица для хранения ваших данных, затем вставьте их столько, сколько хотите.