You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写插入数据的存储过程执行后目标表为空,附SQL代码求助

嘿,我一眼就瞅出问题所在啦——你执行存储过程后目标表还是空的,核心原因是当前的存储过程里只有SELECT查询语句,完全没加把查询结果插入到目标表的逻辑呀!

问题拆解

你的Invoices_AGG存储过程现在只是做了聚合计算,但没有指定把计算结果写入到某个表(不管是你创建的invoices原始表,还是专门存汇总数据的表),所以执行完只会返回查询结果,不会对任何表做写入操作,目标表自然还是空的。

解决方案

我给你分步骤调整,假设你是要把年度聚合结果存入一个专门的汇总表(毕竟原始表invoices应该存的是明细数据):

1. 先创建汇总表(如果还没有的话)

先建一个和你的聚合结果字段匹配的表,比如:

CREATE TABLE invoice_monthly_agg (
    DateID VARCHAR(10) PRIMARY KEY, -- 对应你生成的"01/MM/YYYY"格式
    Business_Total INT, -- 对应invoiceType='B'的总和
    -- 这里根据你没写完的代码,补充其他类型的字段,比如如果还有'C'类型就加Customer_Total INT
);

2. 修改存储过程,添加INSERT逻辑

把查询结果插入到汇总表,同时处理重复执行的问题(避免同一年份的数据重复插入):

ALTER PROCEDURE Invoices_AGG @year int 
AS
BEGIN
    -- 可选:先清空当前年份的旧汇总数据,避免重复插入
    DELETE FROM invoice_monthly_agg 
    WHERE RIGHT(DateID, 4) = CAST(@year AS VARCHAR(4));

    -- 核心步骤:把聚合查询的结果插入到汇总表
    INSERT INTO invoice_monthly_agg (DateID, Business_Total)
    SELECT 
        -- 简化日期格式的写法,不用CASE判断月份位数
        FORMAT(DATEFROMPARTS(@year, MONTH(invoiceDate), 1), '01/MM/yyyy') AS DateID,
        SUM(CASE WHEN invoiceType = 'B' THEN invoiceTotal ELSE 0 END) AS Business_Total
        -- 这里补上你原来没写完的其他CASE语句,比如其他invoiceType的统计项
    FROM invoices
    WHERE YEAR(invoiceDate) = @year -- 只统计指定年份的数据
    GROUP BY MONTH(invoiceDate); -- 按月份分组,保证每个月一条汇总数据
END;

3. 执行存储过程并验证

-- 执行存储过程,传入要统计的年份
EXEC Invoices_AGG @year = 2024;

-- 查询汇总表,看数据是否插入成功
SELECT * FROM invoice_monthly_agg;
额外提醒
  • 先确认invoices原始表本身有对应年份的数据哦!如果原始表都没数据,聚合查询自然没结果,汇总表还是空的,可以先查一下:SELECT * FROM invoices WHERE YEAR(invoiceDate) = 2024;
  • 如果你的目标表就是invoices原始表,那逻辑就不太对了——原始表应该存的是单笔发票数据,汇总数据建议单独存到汇总表里,避免数据混乱。

内容的提问来源于stack exchange,提问作者JOE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:17:14