如何正确执行SQL自定义函数GetPaidInfo?参数不足报错排查
搞定这个SQL函数参数报错!
嘿,你遇到的“过程或函数dbo.GetPaidInfo的参数不足”报错原因其实很直观——你调用函数时只传了一个参数"1",但从你贴的函数定义来看,它要求两个必填参数:
@InvId INT:用来指定发票ID的整数参数@PmtType VARCHAR(10):用来区分支付类型的字符串参数(比如函数里判断的'Cash')
正确的调用姿势
你需要补上第二个参数才能正常执行。比如如果是现金支付场景,调用语句应该写成:
SELECT [dbo].[GetPaidInfo](1, 'Cash')
如果是刷卡支付,就改成:
SELECT [dbo].[GetPaidInfo](1, 'Card')
小提醒:SQL里字符串参数标准写法是用单引号',你原来用的双引号"虽然部分数据库环境支持,但单引号兼容性更好,建议统一用它。
顺手给你提两个优化点
看了你的函数代码,发现两个可以改进的地方:
空值判断逻辑错误
你写的IF (@Currency2 != NULL OR @Currency2 != '')永远为真——因为一个变量不可能同时是NULL又是空字符串,所以这个条件不管Currency2实际值是什么都会成立。正确的判断应该用AND:IF (@Currency2 IS NOT NULL AND @Currency2 != '')同理
@Currency3的判断也要改成这个逻辑,不然会导致结果里出现多余的+符号。减少重复查询提升性能
函数里多次单独查询Payment表的同一行数据(比如分别查Card、Currency2等字段),可以改成一次查询把所有需要的字段都取出来,这样能减少数据库的IO操作,提升函数执行效率:-- 先一次性把需要的字段都赋值到变量里 DECLARE @Card VARCHAR(50), @Currency2 VARCHAR(50), @Amt2 VARCHAR(50) DECLARE @Currency3 VARCHAR(50), @Amt3 VARCHAR(50), @Currency1 VARCHAR(50), @Amt1 DECIMAL(18,2) SELECT @Card = Card, @Currency2 = Currency2, @Amt2 = Amt2, @Currency3 = Currency3, @Amt3 = Amt3, @Currency1 = Currency1, @Amt1 = Amt1 FROM Payment WHERE InvId = @InvId后续直接用这些变量就行,不用再多次查同一张表啦。
内容的提问来源于stack exchange,提问作者Nimo
相关产品推荐
相关产品推荐

