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

SQL存储过程中VARCHAR(MAX)=NULL与fnStringSplit用法咨询

问题1:未传入值时@DivisionList参数的生效逻辑

首先看存储过程的参数定义:@DivisionList VARCHAR(MAX) = NULL,该参数默认值为NULL,当调用存储过程没有显式传入该参数时,它的取值就是默认的NULL。
WHERE条件里对应的判断逻辑是:

(
    (@DivisionList IS NULL)
    OR pl.Division IN
       (
           SELECT Value FROM dbo.fnStringSplit(@DivisionList, ',')
       )
)

这是SQL中非常常见的可选参数过滤逻辑:

  • 当@DivisionList为NULL时,@DivisionList IS NULL条件结果为真,由于OR运算符的短路特性,后半段的IN判断不会执行,整个括号内的过滤条件整体为真,相当于不对Division字段做任何限制,所有Division的符合其他条件的记录都会被返回。
  • 只有当@DivisionList不为NULL时,才会执行后半段的IN判断,只返回Division在传入的列表中的记录。

另外两个参数@RegionList、@PlanIDList的生效逻辑和@DivisionList完全一致。


问题2:fnStringSplit函数的作用

fnStringSplit是业务侧自定义的表值函数,功能是将传入的、用指定分隔符拼接的字符串,拆分后返回多行单个值的结果集,结果集包含Value字段存储每一个拆分后的值。
举个例子:如果传入@DivisionList = '华东,华南,华北',分隔符指定为逗号,那么dbo.fnStringSplit(@DivisionList, ',')返回的结果集为:

Value
华东
华南
华北

配合IN子句使用,就可以实现单次传入多个筛选值的多选过滤需求,不需要多次调用存储过程或者拼接动态SQL。
注:SQL Server 2016及更高版本已经提供了内置的STRING_SPLIT函数,和这个自定义函数功能基本一致。


内容的提问来源于stack exchange,提问作者Test 888

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 13:45:09