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
相关产品推荐
相关产品推荐

