MSSQL存储过程UNION ALL多表报错:无效列名GetSavings/GiveSavings求助
解决UNION ALL存储过程中的列名无效错误(Msg 207)
你碰到的Msg 207错误根源很明确:UNION ALL要求所有子查询返回的列集合必须完全匹配——包括列数、数据类型,而且上层查询会基于第一个子查询的列名来识别所有列。你的四个子查询各自只返回了部分列,导致合并后的临时表t里根本不存在GetSavings和GiveSavings这两个字段,上层的SUM()函数自然找不到它们。
修正后的存储过程代码
ALTER PROCEDURE [dbo].[USP_GetLoanSavingsDetailsByLoanTakerId] ( @MemberId bigint, @UserId bigint ) AS BEGIN --EXEC USP_GetLoanSavingsDetailsByLoanTakerId 5, 26 SELECT EntryDate, SUM(LoanGiven) AS LoanGiven, SUM(LoanReceived) AS LoanReceived, SUM(GetSavings) AS GetSavings, SUM(GiveSavings) AS GiveSavings FROM( -- 给指定人员的贷款:只填充LoanGiven,其余列设为0 SELECT EntryDate, TotalAmount as LoanGiven, 0 as LoanReceived, 0 as GetSavings, 0 as GiveSavings FROM tblGiveLoan WHERE UserId = @UserId and MemberId = @MemberId UNION ALL -- 收到指定人员的贷款:只填充LoanReceived,其余列设为0 SELECT EntryDate, 0 as LoanGiven, Amount as LoanReceived, 0 as GetSavings, 0 as GiveSavings FROM tblReceiveLoan WHERE UserId = @UserId and MemberId = @MemberId UNION ALL -- 从指定人员处获取的储蓄:只填充GetSavings,其余列设为0 SELECT EntryDate, 0 as LoanGiven, 0 as LoanReceived, TotalAmount as GetSavings, 0 as GiveSavings FROM tblGetSavings WHERE UserId = @UserId and MemberId = @MemberId UNION ALL -- 给指定人员的储蓄:只填充GiveSavings,其余列设为0 SELECT EntryDate, 0 as LoanGiven, 0 as LoanReceived, 0 as GetSavings, TotalAmount as GiveSavings FROM tblGiveSavings WHERE UserId = @UserId and MemberId = @MemberId ) t GROUP BY EntryDate ORDER BY EntryDate ASC END
关键修正说明
- 每个子查询都显式包含了所有4个需要汇总的列,对应业务场景不需要的列就赋值为
0,确保UNION ALL合并后的临时表结构完全一致 - 这样上层的
SUM()函数就能正确识别所有列名,不会再出现列名无效的错误 - 同时完整保留了你的业务逻辑:按
EntryDate汇总指定人员的四类交易数据
内容的提问来源于stack exchange,提问作者M_O_MEN
相关产品推荐
相关产品推荐

