需求:三個逗號分隔字符串 A="440,441,442,443"、B="a,b,c,d"、C="1,2,3,4",一一對應組裝為 440,a,1;441,b,2;442,c,3;443,d,4;。使用 CHARINDEX + STUFF 循環分割拼接。
CREATE PROCEDURE dbo.Pro_STR
@A NVARCHAR(200) = '440,441,442,443',
@B NVARCHAR(200) = 'a,b,c,d',
@C NVARCHAR(200) = '1,2,3,4'
AS
BEGIN
DECLARE @result NVARCHAR(4000) = '';
SET @A += ','; SET @B += ','; SET @C += ','; -- 統一加尾部逗號簡化邏輯
WHILE CHARINDEX(',', @A) > 0
BEGIN
SET @result += LEFT(@A, CHARINDEX(',', @A)-1) + ','
+ LEFT(@B, CHARINDEX(',', @B)-1) + ','
+ LEFT(@C, CHARINDEX(',', @C)-1) + ';';
SET @A = STUFF(@A, 1, CHARINDEX(',', @A), '');
SET @B = STUFF(@B, 1, CHARINDEX(',', @B), '');
SET @C = STUFF(@C, 1, CHARINDEX(',', @C), '');
END
SELECT @result AS CombinedResult; -- 直接返回結果集
END
CHARINDEX(',', str):查找逗號位置(1-based)LEFT(str, len):取左側子串STUFF(str, start, len, replacement):刪除指定長度並插入新串(此處用空串實現截取)SELECT STRING_AGG(a.value + ',' + b.value + ',' + c.value, ';') WITHIN GROUP (ORDER BY a.ordinal)
FROM STRING_SPLIT(@A, ',') a
JOIN STRING_SPLIT(@B, ',') b ON a.ordinal = b.ordinal
JOIN STRING_SPLIT(@C, ',') c ON a.ordinal = c.ordinal;
STRING_SPLIT 返回 value 與 ordinal(順序號),配合 STRING_AGG 可無循環完成。注意 STRING_SPLIT 不保證順序,需 Join ordinal 對齊。