1:首先创建一个自定义函数实现分隔的功能:
思路:
(1、获取分隔符在源字符串中第一次出现的位置,把获取的位置之前的子字符串赋值给表的一列
(2、把第一步获取的位置之后的子字符串赋值为新的源字符串
(3、再获取分隔符在第二步得到的新的源字符串中的位置,并把获取的位置之前的子字符串赋值给表的一列
(4、重复第2、3步骤,直到子字符串中无分隔符;
CREATE FUNCTION f_splitt(@sep_s varchar(100), @s VARCHAR(1000)) --分隔符@sep_s
RETURNS @v_t TABLE(a VARCHAR(100))
AS
BEGIN
DECLARE @i bigint;
set @i=CHARINDEX(@sep_s,@s);
while @i>0
BEGIN
INSERT @v_t VALUES(LEFT(@s,@i-1));
set @s=SUBSTRING(@s,@i+1,LEN(@s)-@i);
set @i=CHARINDEX(@sep_s,@s);
END
IF @s<>'\'
INSERT @v_t(a) VALUES (@s);
--print @s;
RETURN
END:
比如:字符串"4|0|0|0|0|0|0|0|1|9|1|0|0" 被分割成13个数值。
2:创建存储过程从源表获取数据,经过分隔,插入到一个目标表中;
ALTER PROCEDURE get_rows
AS
begin
DECLARE @task_name VARCHAR(1000);
DECLARE @store_code VARCHAR(100);
DECLARE @member_code VARCHAR(100);
DECLARE @addtime bigint;
DECLARE @num_option_data VARCHAR(100);
DECLARE cur_f cursor for SELECT task_name,store_code,member_code,addtime,num_option_data from kingkr_task_work;
open cur_f
FETCH NEXT from cur_f into @task_name,@store_code,@member_code,@addtime,@num_option_data;
WHILE @@fetch_status=0
BEGIN
INSERT into kingkr_task_work_temp
SELECT @task_name,@store_code,@member_code,@addtime,a from dbo.f_splitt('|',@num_option_data);
FETCH NEXT from cur_f into @task_name,@store_code,@member_code,@addtime,@num_option_data;
END;
CLOSE cur_f;
DEALLOCATE cur_f;
end
3:分隔成多个值后,再将这多个值排序
SELECT task,store_code,member_code,addtime,num_option_data,
row_number()OVER(partition by member_code,,addtime ORDER BY addtime) mm
from kingkr_task_work_temp;
partition by member_code,addtime:把member_code,addtime作为一组(分区)排序。
结果如下: