TSQL字符串拆分iTVF空值处理:需返回空结果集
解决SplitString函数空字符串输入无返回的问题
原函数在传入空字符串作为@List参数时,因LEN(@List)=0导致WHERE子句无匹配行,返回空表。若你需要传入空字符串时返回包含一个空值的结果集(而非完全无返回),可通过添加分支逻辑修改函数:
修改后的函数代码
ALTER FUNCTION [dbo].[SplitString] (@List NVARCHAR(MAX), @Delim VARCHAR(255)) RETURNS TABLE AS RETURN ( -- 处理非空字符串的原有逻辑 SELECT [Value], idx = RANK() OVER (ORDER BY n) FROM (SELECT n = Number, [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number], CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number]))) FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name) FROM sys.all_objects) AS x WHERE Number <= LEN(@List) AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim) AS y -- 新增:处理空字符串输入的情况 UNION ALL SELECT '' AS [Value], 1 AS idx WHERE @List = '' ); GO
测试验证
- 常规输入测试:
SELECT value FROM dbo.SplitString('a|b|c', '|')
返回结果:
| value | idx |
|---|---|
| a | 1 |
| b | 2 |
| c | 3 |
- 空字符串输入测试:
SELECT value FROM dbo.SplitString('', '|')
返回结果:
| value | idx |
|---|---|
| 1 |
逻辑说明
新增的UNION ALL分支仅在@List为空字符串时执行,返回一行包含空值和索引1的记录,完全兼容原函数对非空字符串的处理逻辑。若你实际需求是保持空结果集(无任何行),则原函数无需修改,但根据问题描述,推测你需要的是返回包含空值的结果集,因此采用上述方案。
内容的提问来源于stack exchange,提问作者Karthik Karnam
相关产品推荐
相关产品推荐

