SQL存储过程参数截取赋值报错:未声明标量变量@FiscalCalendarYear
问题解决:存储过程变量赋值错误及字符串截取修正
错误原因
触发Must declare the scalar variable "@FiscalCalendarYear"错误的核心是DECLARE变量赋值的语法错误:直接给标量变量赋值时无需使用SELECT关键字,多余的SELECT导致SQL解析器无法正确识别变量声明逻辑,进而抛出未声明变量的异常。另外,你原代码中月份截取的SUBSTRING参数也需要调整,才能匹配「年份 空格 P 月份」的格式。
修正后的代码
Alter PROCEDURE [DW].[SP_Fetch_Data] @par_FiscalCalendarYear varchar(10) AS BEGIN /* DW.SP_Fetch_Data @par_FiscalCalendarYear = '2022 P11' */ /* BALANCE ACCOUNTS */ -- 修正赋值语法,移除多余SELECT;调整月份截取位置适配单/双位数月份 DECLARE @FiscalCalendarYear int = SUBSTRING(@par_FiscalCalendarYear, 1, 4) /* 提取年份 */ , @FiscalCalendarMonth int = SUBSTRING(@par_FiscalCalendarYear, 7, 2) /* 提取月份 */; DECLARE @FiscalCalendarPeriod int = @FiscalCalendarYear * 100 + @FiscalCalendarMonth -- 后续业务逻辑... END
额外优化方案
如果要更稳妥地适配1-12的单/双位数月份,推荐结合CHARINDEX和RIGHT函数,避免因固定索引计算出错:
DECLARE @FiscalCalendarMonth int = RIGHT(@par_FiscalCalendarYear, LEN(@par_FiscalCalendarYear) - CHARINDEX('P', @par_FiscalCalendarYear))
该方法会自动定位字符P的位置,提取其后的所有内容作为月份,兼容所有符合格式的输入值。
内容的提问来源于stack exchange,提问作者Greencolor
相关产品推荐
相关产品推荐

