Sql 存储过程中的多重插入

Sql 存储过程中的多重插入,sql,sql-server,stored-procedures,sql-insert,Sql,Sql Server,Stored Procedures,Sql Insert,我觉得这可能是一个非常容易的问题,但我不能完全找到我要找的。我不熟悉存储过程,但我正在尝试创建一个存储过程,以便在某种程度上自动化我每年都要做的事情。我有一些变量,然后我有一个WITH语句。我想使用我用with语句创建的表/视图将多行插入到另一个表中。我有这样的想法: DECLARE @YEAR INT SET @YEAR = 2018 -- MOD DECLARE @NA_MOD FLOAT SET @NA_MOD = 0.69; DECLARE @EA_MOD FLOAT SET @EA_

我觉得这可能是一个非常容易的问题,但我不能完全找到我要找的。我不熟悉存储过程,但我正在尝试创建一个存储过程,以便在某种程度上自动化我每年都要做的事情。我有一些变量,然后我有一个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、在第一次插入后加逗号或分号的各种组合,但都没有效果。这可能吗?我是否犯了一个非常简单的语法错误?

CTE仅对后面的语句有效,因此在第二次插入中,它不再是已知的

您可以使用临时表或表变量

但是,如果你把“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中明确提及目标列。

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;
顺便说一下,建议在插入中明确提及目标列。

添加GO或;没有意义,因为CTE后面只能跟一次选择、插入、删除和使用,这使得您的第二次插入无法工作

一个可能的解决方案是重新定义一个表DECLARE@T table。。。或者使用临时表存储数据,然后插入任意数量的数据。

添加GO或;没有意义,因为CTE后面只能跟一次选择、插入、删除和使用,这使得您的第二次插入无法工作


一个可能的解决方案是重新定义一个表DECLARE@T table。。。或者使用临时表存储数据,然后插入任意数量的数据。

CTE只能后跟选择、删除和更新。您不能从CTE插入两次,这意味着插入TRACKINGTABLE2将失败。您可以声明一个表来存储数据或创建一个临时表。CTE后面只能跟一个SELECT、DELETE、UPDATE。您不能从CTE插入两次,这意味着插入TRACKINGTABLE2将失败。您可以声明一个表来存储数据或创建一个临时表。谢谢!事实上,我刚刚修补了一个临时表,这就成功了。再次感谢!非常感谢。事实上,我刚刚修补了一个临时表,这就成功了。再次感谢!非常感谢。事实上,我刚刚修补了一个临时表,这就成功了。再次感谢!非常感谢。事实上,我刚刚修补了一个临时表,这就成功了。再次感谢!