You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向单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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:50:26