如何在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
逻辑说明
- 先用
REPLACE清除输入字符串中的空格,避免因空格导致拆分结果异常; - 用
STRING_SPLIT按逗号拆分出每个独立的组; - 对每个组再次使用
STRING_SPLIT按~拆分出所有值; - 通过
JSON_VALUE提取每组的第一个值作为主ID,过滤掉与主ID重复的行(即每组的第一个元素),保留后续的关联ID; - 最后按主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
相关产品推荐
相关产品推荐

