解读已离职人员编写的SQL表值函数[dbo].[udfSplitString]的功能
自定义表值函数
[dbo].[udfSplitString]功能分析 函数定义
ALTER FUNCTION [dbo].[udfSplitString] ( @Input NVARCHAR(MAX), @Character CHAR(1) ) RETURNS @Output TABLE ( Item NVARCHAR(1000) ) AS BEGIN DECLARE @StartIndex INT, @EndIndex INT SET @StartIndex = 1 IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character BEGIN SET @Input = @Input + @Character END WHILE CHARINDEX(@Character, @Input) > 0 BEGIN SET @EndIndex = CHARINDEX(@Character, @Input) INSERT INTO @Output(Item) SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1) SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input)) END RETURN END
基础参数说明
- 输入参数
@Input NVARCHAR(MAX):待拆分的原始字符串,支持最大长度的Unicode文本 - 输入参数
@Character CHAR(1):指定的拆分分隔符,仅支持传入单个字符 - 返回值:结构为
(Item NVARCHAR(1000))的表,每一行存储一个拆分得到的子串,子串最大长度为1000字符
核心运行逻辑
- 边界兼容处理:先判断原始字符串末尾是否已经带有指定分隔符,如果没有就自动在末尾补加分隔符,避免最后一段子串被遗漏拆分
- 循环拆分逻辑:通过循环查找分隔符在剩余待处理字符串中的位置,每匹配到一个分隔符就截取分隔符之前的内容插入结果表,再将已经处理完成的部分(包含当前匹配到的分隔符)从待处理字符串中移除
- 循环终止条件:剩余待处理字符串中不存在指定分隔符时,停止拆分返回结果表
实际作用
这是一个通用的字符串拆分工具函数,作用是将用单个字符分隔的长字符串,拆解为多行的子串集合,常见使用场景包括:
- 处理前端传入的多值拼接参数,拆分后用于IN条件查询
- 拆分业务表中存储的拼接格式字段,转化为结构化数据做关联分析
调用示例
执行以下调用:
SELECT * FROM dbo.udfSplitString('北京,上海,广州,深圳', ',')
将返回4行结果,Item字段的值分别为:北京、上海、广州、深圳
注意事项
- 单条子串长度超过1000字符时会被截断
- 仅支持单个字符作为分隔符,不支持多字符分隔符的拆分需求
内容的提问来源于stack exchange,提问作者gumdrop
相关产品推荐
相关产品推荐

