向单varchar(max)参数存储过程传多参数并拆分赋值
拆分复合字符串到对应SQL列的解决方案
你当前的存储过程仅声明了一个varchar(max)类型参数,传入的是由多组Ref=xxx;Src=xxx;用逗号拼接而成的字符串,需要将每组中的Ref和Src值分别提取到对应列中。现有查询里Ref列结果符合预期,但Src列的取值逻辑错误,导致结果不正确。
改进现有循环方法
调整Src列的提取逻辑,先单独取出当前处理的组,再精准定位Src值的位置:
WHILE LEN(@LISTMIXTRD) > 0 BEGIN -- 取出当前要处理的单组数据 DECLARE @CurrentGroup NVARCHAR(MAX) = LEFT(@LISTMIXTRD, CHARINDEX(',', @LISTMIXTRD + ',') - 1) SELECT -- 提取Ref值 REPLACE(LEFT(@CurrentGroup, CHARINDEX(';Src=', @CurrentGroup) - 1), 'Ref=', '') AS Ref, -- 提取Src值:定位到;Src=之后,取到下一个分号前的内容 REPLACE( SUBSTRING( @CurrentGroup, CHARINDEX(';Src=', @CurrentGroup) + 5, CHARINDEX(';', @CurrentGroup, CHARINDEX(';Src=', @CurrentGroup)) - CHARINDEX(';Src=', @CurrentGroup) - 5 ), 'Src=', '' ) AS Src -- 移除已处理的组,继续循环 SET @LISTMIXTRD = STUFF(@LISTMIXTRD, 1, CHARINDEX(',', @LISTMIXTRD + ','), '') END
更高效的拆分方案(适用于SQL Server 2016及以上版本)
利用内置的STRING_SPLIT函数先拆分所有组,再批量提取字段,避免循环的低效问题:
SELECT -- 提取每组的Ref值 REPLACE(LEFT(value, CHARINDEX(';Src=', value) - 1), 'Ref=', '') AS Ref, -- 提取每组的Src值 REPLACE( SUBSTRING( value, CHARINDEX(';Src=', value) + 5, CHARINDEX(';', value, CHARINDEX(';Src=', value)) - CHARINDEX(';Src=', value) - 5 ), 'Src=', '' ) AS Src FROM STRING_SPLIT(@LISTMIXTRD, ',') WHERE value <> '' -- 过滤拆分后可能出现的空值
内容的提问来源于stack exchange,提问作者theo
相关产品推荐
相关产品推荐

