如何将标量函数返回值存入变量?单元测试参数报错排查
问题分析与解决
你遇到的这个错误,根源在于标量函数调用时的语法细节——你在函数名和参数括号之间加了一个空格,导致SQL Server错误地将它解析成了存储过程调用,而非标量函数调用。
具体原因
在SQL Server中,标量函数的调用语法要求函数名与紧跟其后的左括号(之间不能有空格。如果加了空格,SQL Server会把GetEasters识别为存储过程,而存储过程的调用逻辑和参数传递方式和标量函数完全不同:
- 存储过程不能用
SET语句直接赋值给变量 - 存储过程的命名参数写法也和函数不同
这就导致了系统提示“参数数量不足”的错误。
而你能正常运行的代码dim.GetEasters(2018, 'Monday', 1),恰恰是因为函数名和括号之间没有空格,SQL Server正确识别为标量函数调用,并且使用位置参数的方式也符合语法要求。
修正后的单元测试代码
只需要去掉函数名和左括号之间的空格,同时修正验证逻辑的错误(原代码误用了@@ROWCOUNT):
-- 提前声明所有变量和表变量 DECLARE @TestName VARCHAR(50), @UnitTestStart DATETIME, @RequiredResult INT, @FunctionResult INT, @TestResult BIT, @UnitTestEnd DATETIME; DECLARE @Result TABLE ( TestName VARCHAR(50), TestResult BIT, TestStart DATETIME, TestEnd DATETIME ); -- 测试名称 SET @TestName = 'EastersMonday' -- 设置单元测试开始时间 SET @UnitTestStart = GETDATE() -- 预期结果 SET @RequiredResult = 20180402 -- 调用函数(去掉函数名和括号间的空格) SET @FunctionResult = DWH_Staging.dim.GetEasters(@Year = 2018, @Day = 'Monday', @CountryID = 1) -- 验证结果(直接比较函数返回值和预期结果) SELECT @TestResult = IIF(@RequiredResult = @FunctionResult,1,0) -- 设置单元测试结束时间 SET @UnitTestEnd = GETDATE() -- 记录日志 INSERT INTO @Result (TestName,TestResult,TestStart,TestEnd) VALUES (@TestName,@TestResult,@UnitTestStart,@UnitTestEnd)
额外说明
原代码里用@@ROWCOUNT做验证是错误的——标量函数返回单个值,@@ROWCOUNT返回的是上一个语句影响的行数,这里函数调用不会改变行数,所以会导致测试结果永远为0,必须直接比较@RequiredResult和@FunctionResult。
内容的提问来源于stack exchange,提问作者user5021612
相关产品推荐
相关产品推荐

