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

如何在SQL Server存储过程中拆分特定格式的输入参数

SQL Server存储过程实现参数拆分并生成目标格式输出

针对你提供的输入参数格式,以下是两种适用于不同SQL Server版本的存储过程实现方案:

方案一:适用于SQL Server 2016及以上(支持STRING_SPLIT内置函数)

CREATE PROCEDURE SplitInputParameter
    @input VARCHAR(MAX) = '1~100~101~103,2~200~201~203,3~300~301~303, 4~400~401~403'
AS
BEGIN
    SET NOCOUNT ON;

    -- 清理输入中的空格,避免拆分错误
    DECLARE @cleanInput VARCHAR(MAX) = REPLACE(@input, ' ', '');

    -- 拆分逗号分隔的组,再拆分每组内的~分隔值
    SELECT
        JSON_VALUE('["' + REPLACE(s.value, '~', '","') + '"]', '$[0]') AS MainId,
        ss.value AS SubId
    FROM STRING_SPLIT(@cleanInput, ',') s
    CROSS APPLY STRING_SPLIT(s.value, '~') ss
    -- 过滤掉每组的第一个值,只保留关联ID行
    WHERE ss.value <> JSON_VALUE('["' + REPLACE(s.value, '~', '","') + '"]', '$[0]')
    ORDER BY MainId, SubId;
END

逻辑说明

  1. 先用REPLACE清除输入字符串中的空格,避免因空格导致拆分结果异常;
  2. 用STRING_SPLIT按逗号拆分出每个独立的组;
  3. 对每个组再次使用STRING_SPLIT按~拆分出所有值;
  4. 通过JSON_VALUE提取每组的第一个值作为主ID,过滤掉与主ID重复的行(即每组的第一个元素),保留后续的关联ID;
  5. 最后按主ID和关联ID排序,确保输出顺序符合预期。

方案二:适用于SQL Server 2016以下版本(自定义字符串拆分函数)

如果你的SQL Server版本不支持STRING_SPLIT,先创建自定义拆分函数:

CREATE FUNCTION dbo.SplitString
(
    @str NVARCHAR(MAX),
    @delimiter CHAR(1)
)
RETURNS @output TABLE (value NVARCHAR(MAX))
BEGIN
    DECLARE @start INT, @end INT
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @str)
    WHILE @start < LEN(@str) + 1 BEGIN
        IF @end = 0 
            SET @end = LEN(@str) + 1
        INSERT INTO @output (value)
        VALUES(SUBSTRING(@str, @start, @end - @start))
        SET @start = @end + 1
        SET @end = CHARINDEX(@delimiter, @str, @start)
    END
    RETURN
END

再创建存储过程:

CREATE PROCEDURE SplitInputParameter
    @input VARCHAR(MAX) = '1~100~101~103,2~200~201~203,3~300~301~303, 4~400~401~403'
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @cleanInput VARCHAR(MAX) = REPLACE(@input, ' ', '');

    SELECT
        (SELECT TOP 1 value FROM dbo.SplitString(s.value, '~')) AS MainId,
        ss.value AS SubId
    FROM dbo.SplitString(@cleanInput, ',') s
    CROSS APPLY dbo.SplitString(s.value, '~') ss
    WHERE ss.value <> (SELECT TOP 1 value FROM dbo.SplitString(s.value, '~'))
    ORDER BY MainId, SubId;
END

使用方法

执行存储过程即可得到目标格式输出:

EXEC SplitInputParameter;

内容的提问来源于stack exchange,提问作者Krishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:45:14