You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:48:15