几个SQL Server split自定义函数使用

作者:袖梨 2022-06-29

例1,要求取得字符串aa,dd,cc,rr,fff中某个位置的字符串,如果在C#或Java很容易通过Split来实现,但是在Sql Server中就没有直接提供Split这个函数。

当然,此类问题总是可以解决的。

 代码如下 复制代码

ALTER function [dbo].[core_split]
(
@str varchar(100),
@split char(1),
@index int
)

returns varchar(10) as
begin

declare @count int
declare @s varchar(10)

set @count = 0;
set @s = ''
while(charindex(@split,@str)<>0)
begin
if @count = @index begin
set @s = substring(@str,1,charindex(@split,@str)-1)
break
end
set @str = stuff(@str,1,charindex(@split,@str),'')
set @count = @count + 1
end
if charindex(@split,@str)=0 begin
set @s = @str
end
return @s
end

例如

 代码如下 复制代码
select dbo.core_split('aa,ss,ee,rr,da,tt',',',1)

就可获得ss

例2

 代码如下 复制代码

--SQL Server Split函数
--Author:zc_0101
--说明:
--支持分割符多字节
--使用方法
--Select * FROM DBO.F_SQLSERVER_SPLIT('1203401230105045','0')   
--select * from DBO.F_SQLSERVER_SPLIT('abc1234a12348991234','1234')
--Select * from DBO.F_SQLSERVER_SPLIT('ABC',',')  
 

CREATE FUNCTION F_SQLSERVER_SPLIT(@Long_str varchar(8000),@split_str varchar(100))   
RETURNS  @tmp TABLE(       
    ID          inT     IDENTITY PRIMARY KEY,     
    short_str   varchar(8000)   
)   
AS  
BEGIN  
    DECLARE @long_str_Tmp varchar(8000),@short_str varchar(8000),@split_str_length int  
    SET @split_str_length = LEN(@split_str)   
    IF CHARINDEX(@split_str,@Long_str)=1
         SET @long_str_Tmp=SUBSTRING(@Long_str,@split_str_length+1,LEN(@Long_str)-@split_str_length)
    ELSE
         SET @long_str_Tmp=@Long_str
    IF CHARINDEX(REVERSE(@split_str),REVERSE(@long_str_Tmp))>1   
        SET @long_str_Tmp=@long_str_Tmp+@split_str   
    ELSE  
        SET @long_str_Tmp=@long_str_Tmp   
    IF CHARINDEX(@split_str,@long_str_Tmp)=0
        Insert INTO @tmp select @long_str_Tmp
    ELSE
        BEGIN
            WHILE CHARINDEX(@split_str,@long_str_Tmp)>0   
                BEGIN  
                    SET @short_str=SUBSTRING(@long_str_Tmp,1,CHARINDEX(@split_str,@long_str_Tmp)-1)   
                    DECLARE @long_str_Tmp_LEN INT,@split_str_Position_END int  
                    SET @long_str_Tmp_LEN = LEN(@long_str_Tmp)   
                    SET @split_str_Position_END = LEN(@short_str)+@split_str_length   
                    SET @long_str_Tmp=REVERSE(SUBSTRING(REVERSE(@long_str_Tmp),1,@long_str_Tmp_LEN-@split_str_Position_END))
                    IF @short_str<>'' Insert INTO @tmp select @short_str   
                END          
        END
    RETURN    
END

例3

 代码如下 复制代码

=====================
--Author:    
--Createdate:  <2007/8/18>
-- Description:  <拆分字符串函数>
--=============================================
CREATE FUNCTION[dbo].[Split]
(
@SplitString varchar(8000),-- nvarchar(4000)
@Separatorvarchar(2)=','
)
RETURNS@SplitStringsTableTABLE
(
[id]intidentity(1,1),
[value]varchar(8000)-- nvarchar(4000)
)
AS
BEGIN
  DECLARE@CurrentIndexint;
  DECLARE@NextIndexint;
  DECLARE@ReturnTextvarchar(8000);-- nvarchar(4000)
  SELECT@CurrentIndex=1;
  WHILE(@CurrentIndex<=len(@SplitString))
  BEGIN
    SELECT@NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
    IF(@NextIndex=0OR@NextIndexISNULL)
      SELECT@NextIndex=len(@SplitString)+1;
    
    SELECT@ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
    INSERTINTO@SplitStringsTable([value])
    VALUES(@ReturnText);
    
    SELECT@CurrentIndex=@NextIndex+1;
  END
  RETURN;
END

相关文章

精彩推荐