SQL自定义函数split分隔字符串

时间:2024-01-21 23:36:33

SQL自定义函数split分隔字符串

一、F_Split:分割字符串拆分为数据表

SQL自定义函数split分隔字符串
Create FUNCTION [dbo].[F_Split]
(
@SplitString nvarchar(max), --源字符串
@Separator nvarchar(10)=' ' --分隔符号,默认为空格
)
RETURNS @SplitStringsTable TABLE --输出的数据表
(
[id] int identity(1,1),
[value] nvarchar(max)
)
AS
BEGIN
DECLARE @CurrentIndex int;
DECLARE @NextIndex int;
DECLARE @ReturnText nvarchar(max); SELECT @CurrentIndex=1;
WHILE(@CurrentIndex<=len(@SplitString))
BEGIN
SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
IF(@NextIndex=0 OR @NextIndex IS NULL)
SELECT @NextIndex=len(@SplitString)+1;
SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
SELECT @CurrentIndex=@NextIndex+1;
END
RETURN;
END --使用示例
select * FROm dbo.F_Split('111,b2222,323232,32d,e,323232f,g3222', ',')
SQL自定义函数split分隔字符串

结果为

id          value

-------- ---------------------------------------

1           111

2           b2222

3           323232

4           32d

5           e

6           323232f

7           g3222

=========================================================================

二、F_SplitLength:获取分割后的字符数组的长度

SQL自定义函数split分隔字符串
Create function [dbo].[F_SplitLength]
(
@String nvarchar(max), --要分割的字符串
@Split nvarchar(10) --分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int set @String=ltrim(rtrim(@String))
set @location=charindex(@split,@String)
set @length=1
while @location<>0
begin
set @start=@location+1
set @location=charindex(@split,@String,@start)
set @length=@length+1
end
return @length
end --调用示例
select dbo.F_SplitLength('111,b2222,323232,32d,e,323232f,g3222',',')
SQL自定义函数split分隔字符串

结果为7。

=========================================================================

三、F_SplitOfIndex:获取分割后特定索引的字符串

SQL自定义函数split分隔字符串
Create function [dbo].[F_SplitOfIndex]
(
@String nvarchar(max), --要分割的字符串
@split nvarchar(10), --分隔符号
@index int --取第几个元素
)
returns nvarchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int set @String=ltrim(rtrim(@String))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@String) while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@String,@start)
set @next=@next+1
end
if @location =0 select @location =len(@String)+1
return substring(@String,@start,@location-@start)
end --使用示例
select dbo.F_SplitOfIndex('111,b2222,323232,32d,e,323232f,g3222',',', 3)
SQL自定义函数split分隔字符串

结果为323232。

转自:http://www.cnblogs.com/xiaofengfeng/archive/2012/06/01/2530930.html

-------------------------------------------------------------------------------------

SQL字符串逗号分隔函数

SQl -Function创建函数数据库输出的结果用逗号隔开,在开发中也有许多以参数的形式传入带逗号字条串参数(数据大时不建议这样做)

例:查找姓名为“张三,李二” 的数据此时在数据库里就要对此参数做处理如图:

SQL自定义函数split分隔字符串

函数代码如下

SQL自定义函数split分隔字符串
CREATE FUNCTION [dbo].[fnSplitStr] (
@sText NVARCHAR(Max),
@sDelim CHAR(1)
) RETURNS @retArray TABLE (
value VARCHAR(100)
)
AS
BEGIN
DECLARE
@posStart BIGINT,
@posNext BIGINT,
@valLen BIGINT,
@sValue NVARCHAR(100); IF @sDelim IS NULL
BEGIN
IF LEN(@sText)>100 SET @sText = SUBSTRING(@sText, 1, 100) INSERT @retArray (value)
VALUES (@sText);
END
ELSE
BEGIN
SET @posStart = 1; WHILE @posStart <= LEN(@sText)
BEGIN
SET @posNext = CHARINDEX(@sDelim, @sText, @posStart); IF @posNext <= 0
SET @valLen = LEN(@sText) - @posStart + 1;
ELSE
SET @valLen = @posNext - @posStart; SET @sValue = SUBSTRING(@sText, @posStart, @valLen);
SET @posStart = @posStart + @valLen + 1; IF LEN(@sValue) > 0
BEGIN
IF LEN(@sValue)>100 SET @sValue = SUBSTRING(@sValue, 1, 100) INSERT @retArray (value)
VALUES (@sValue);
END
END
END
RETURN
END