一 存储过程
alter FUNCTION [dbo].[F_ProLineDingInfo](
@s varchar(max), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @ProLineDing TABLE(
CompanyName varchar(max),
DepartName varchar(max),
UserName varchar(max),
HJCode varchar(max),--环节名称
DingId varchar(max)
)
AS
BEGIN
DECLARE @CompanyName nvarchar(500);
DECLARE @DepartName nvarchar(500);
DECLARE @UserName nvarchar(max);
DECLARE @HJCode nvarchar(500);
DECLARE @DingId nvarchar(500);
DECLARE
@splitlen int
-- 取分隔符的长度, 在分隔符后面加一个字符是为了避免分隔符以空格结束时, 取不到正确的长度
SET @splitlen = LEN(@split + 'a') - 2
-- 如果待分拆的字符串中存在数据分隔符, 则循环取出每个数据项
WHILE CHARINDEX(@split, @s)>0
BEGIN
DECLARE MyCursor CURSOR
FOR select TOP 1 t2.FullName as DepartName,t3.FullName,t1.RealName,t1.WeChat,t1.NodeCode from Base_User as t1
left join Base_Department as t2 on t1.DepartmentId=t2.DepartmentId
left join Base_Organize as t3 on t2.OrganizeId =t3.OrganizeId
where t1.WeChat =''+LEFT(@s, CHARINDEX(@split, @s) - 1)+''
OPEN MyCursor;
FETCH NEXT FROM MyCursor INTO @DepartName,@CompanyName,@UserName,@DingId,@HJCode;
-- 取第一个数据分隔符前的数据项
INSERT @ProLineDing VALUES(@CompanyName,@DepartName,@UserName,@HJCode,@DingId)
-- 将已经取出的第一个数据项和数据分隔符从待分拆的字符串中去掉
SET @s = STUFF(@s, 1, CHARINDEX(@split, @s) + @splitlen, '')
END
-- 保存最后一个数据项(最后一个数据项后面没有数据分隔符, 故在前面的循环中不会被处理)
INSERT @ProLineDing VALUES(@CompanyName,@DepartName,@UserName,@HJCode,@DingId)
RETURN
end
二:内置函数
select * from SplitString('待拆分的字符串','分隔符',返回值是否包含空串(bit))
示例:
select * from SplitString('201,202,203,3109,3179,3638,4384,4447,4462,3012',',',1)