编写插入数据的存储过程执行后目标表为空,附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
相关产品推荐
相关产品推荐

