兼容级别110下无法使用string_split函数的替代方案及自定义实现方法
SQL Server 兼容级别110下STRING_SPLIT函数替代方案
核心替代方案
- 递归CTE实现:无需创建额外数据库对象,适合单次临时拆分场景,拆分长字符串时性能一般
- XML路径转换实现:调用内置XML处理能力完成拆分,性能优于递归CTE,适合拆分不包含XML特殊字符的短字符串
- 自定义表值函数:封装后可全局复用,支持自定义分隔符,兼容各类特殊字符,适合高频拆分场景
自定义字符串拆分函数实现
以下为兼容SQL Server 2012(兼容级别110)的多语句表值拆分函数,支持传入待拆分字符串、自定义分隔符两个参数,返回拆分后的行号和拆分值:
CREATE FUNCTION dbo.SplitString ( @InputString NVARCHAR(MAX), -- 待拆分的字符串 @Delimiter NVARCHAR(10) -- 自定义分隔符,支持多字符分隔 ) RETURNS @Result TABLE ( RowId INT IDENTITY(1,1), -- 拆分后的顺序号 SplitValue NVARCHAR(MAX) -- 拆分后的值 ) AS BEGIN DECLARE @StartIndex INT = 1, @SplitLen INT = LEN(@Delimiter) -- 补充分隔符避免遗漏最后一段 IF RIGHT(@InputString, @SplitLen) <> @Delimiter SET @InputString += @Delimiter WHILE CHARINDEX(@Delimiter, @InputString, @StartIndex) > 0 BEGIN DECLARE @EndIndex INT = CHARINDEX(@Delimiter, @InputString, @StartIndex) INSERT INTO @Result (SplitValue) VALUES(SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex)) SET @StartIndex = @EndIndex + @SplitLen END RETURN END
调用示例
拆分逗号分隔的字符串:
SELECT * FROM dbo.SplitString('苹果,香蕉,橙子,葡萄', ',')
拆分多字符分隔的字符串:
SELECT * FROM dbo.SplitString('北京||上海||广州||深圳', '||')
提示:如果仅需要拆分单字符分隔的字符串,可将分隔符参数固定为
NVARCHAR(1),能进一步提升函数执行效率。
内容的提问来源于stack exchange,提问作者Chinmoy Bhowmik
相关产品推荐
相关产品推荐

