SQL Server自定义标量函数getFiatProfit始终返回NULL排查
问题原因
- 核心错误是nvarchar类型参数未显式指定长度:SQL Server中声明nvarchar/varchar类型参数、变量时,如果不手动指定长度,默认长度为1。你调用函数时传入的'GBP'、'BTC'这类长度大于1的字符串,存入参数时会被自动截断为第一个字符:
@fiatInvestedCurrency实际拿到的值是'G',@currency实际拿到的值是'B'。后续执行WHERE条件匹配usdtPairs.ID时根本找不到对应记录,@tmp、@usdtgbp变量的查询赋值结果均为NULL,而SQL中任何数值和NULL做算术运算的结果都是NULL,最终函数返回值自然为NULL。 - 额外隐患:函数没有写匹配失败的兜底逻辑,即便参数修正后,如果
usdtPairs表中不存在传入的币种记录,依然会返回NULL。
修正方案
调整参数定义,给nvarchar类型指定和usdtPairs.ID字段一致的长度即可,可额外增加空值判断避免无匹配时返回非预期NULL,修正后的函数代码如下:
/****** Object: UserDefinedFunction [dbo].[getFiatProfit] Script Date: 06/07/2022 11:42:26 ******/ ALTER FUNCTION [dbo].[getFiatProfit] ( @fiatInvested float, @fiatInvestedCurrency nvarchar(10), -- 长度与usdtPairs表ID字段定义保持一致即可 @quantity float, @currency nvarchar(10) -- 同上 ) RETURNS float AS BEGIN declare @tmp float declare @result float declare @usdtgbp float IF (@fiatInvestedCurrency = 'USD') BEGIN select @tmp = [dbo].[usdtPairs].[Value] from [dbo].[usdtPairs] where usdtPairs.ID = @currency; select @usdtgbp = [dbo].[usdtPairs].[Value] from [dbo].[usdtPairs] where usdtPairs.ID = 'GBP'; -- 可根据业务需求调整无匹配时的返回规则,比如抛错、返回0等 IF @tmp IS NULL OR @usdtgbp IS NULL SET @result = NULL ELSE set @result = (((@quantity * @tmp) - @fiatInvested) / @usdtgbp); END ELSE BEGIN select @tmp = [dbo].[usdtPairs].[Value] from [dbo].[usdtPairs] where usdtPairs.ID = @currency; IF @tmp IS NULL SET @result = NULL ELSE set @result = ((@quantity * @tmp) - @fiatInvested); END return (@result) END
内容的提问来源于stack exchange,提问作者Dms2701
相关产品推荐
相关产品推荐

