-- 声明输入字符串和临时表
DECLARE @inputString NVARCHAR(MAX) = 'AD_1_D1_2_3_6fff3';
DECLARE @tempTable TABLE (PartNumber INT, PaddedPart NVARCHAR(10));
-- 初始化变量
DECLARE @start INT = 1;
DECLARE @end INT;
DECLARE @part NVARCHAR(MAX);
DECLARE @maxLength INT = 4; -- 假设每个部分要补足到4位
DECLARE @partNumber INT = 1; -- 用于跟踪部分编号
-- 使用 WHILE 循环来分割字符串
WHILE CHARINDEX('_', @inputString, @start) > 0
BEGIN
SET @end = CHARINDEX('_', @inputString, @start);
SET @part = SUBSTRING(@inputString, @start, @end - @start);
-- 插入到临时表,并用0补足长度
INSERT INTO @tempTable (PartNumber, PaddedPart)
VALUES (@partNumber, RIGHT('0000' + @part, @maxLength));
-- 更新部分编号和起始位置以继续下一次循环
SET @partNumber = @partNumber + 1;
SET @start = @end + 1;
END
-- 处理最后一个部分(没有下划线的部分)
IF @start <= LEN(@inputString)
BEGIN
SET @part = SUBSTRING(@inputString, @start, LEN(@inputString) - @start + 1);
-- 插入到临时表,并用0补足长度
INSERT INTO @tempTable (PartNumber, PaddedPart)
VALUES (@partNumber, RIGHT('0000' + @part, @maxLength));
END
-- 查询临时表以查看结果
SELECT * FROM @tempTable;
image.png
纯分割转行
CREATE FUNCTION [dbo].[SplitStringToRow]
(
@str NVARCHAR(4000)
,@char NVARCHAR(10) = ','
)
--create by lozn
RETURNS @SplitStr TABLE
(
ID int IDENTITY PRIMARY KEY
,Value nvarchar(2000)
)
AS
BEGIN
SET @str = @str + @char
WHILE LEN(@str) > 0
BEGIN
INSERT @SplitStr
SELECT SUBSTRING(@str, 1, CHARINDEX(@char, @str) - 1)
SELECT @str = RIGHT(@str, LEN(@str) - CHARINDEX(@char, @str) - (LEN(@char) - 1))
END
RETURN
END
网友评论