SQL Server 完美SPLIT函数

来源:互联网 发布:淘宝网广场舞裙子 编辑:程序博客网 时间:2024/06/05 15:50
--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 


From: http://www.cnblogs.com/zc_0101/archive/2009/06/30/1513776.html

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

下面是自己换种思路写的方法

--另外一种设计思路ALTER FUNCTION F_SQLSERVER_SPLIT_NEW(@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)--NO SPLITIF CHARINDEX(@split_str,@Long_str) = 0BEGINset @short_str = @Long_strIF @short_str<>'' Insert INTO @tmp select @short_str         END    ELSEBEGINSET @long_str_Tmp = @Long_str --TEMP STR HAS SPLITWHILE(CHARINDEX(@split_str,@long_str_Tmp)> 0)BEGIN--SAVE THE FIRST SPLIT STRset @short_str = substring(@long_str_Tmp,0,CHARINDEX(@split_str,@long_str_Tmp))IF @short_str<>'' INSERT INTO @tmp SELECT @short_str--SET TEMP STR TO OTHER PARTSSET @long_str_Tmp=SUBSTRING(@long_str_Tmp,@split_str_length+1,LEN(@long_str_Tmp)-@split_str_length)--IF TEMP STR NO SPLIT, SAVE HEREIF CHARINDEX(@split_str,@long_str_Tmp)= 0 AND @long_str_Tmp <>''BEGIN set @short_str = @long_str_TmpINSERT INTO @tmp SELECT @short_strENDENDENDRETURN END

上面自己写的方法还有BUG:以下语句中会出错。

SELECT * FROM dbo.FN_SQLSERVER_SPLIT('c3058e26-ff3c-4f0d-92a5-76f34340de3b,7f48477c-860e-4a8d-a14f-7844beb6671c', ',');
SELECT * FROM dbo.fn_split('c3058e26-ff3c-4f0d-92a5-76f34340de3b,7f48477c-860e-4a8d-a14f-7844beb6671c', ',');--此方法请看下面



另外提供一个更完美的。

SET QUOTED_IDENTIFIER ONSET ANSI_NULLS ONGOcreate function fn_split(@SourceSql varchar(8000),@StrSeprate varchar(10))returns @temp table(AllItem varchar(100))--实现split功能 的函数as begindeclare @i intset @SourceSql=rtrim(ltrim(@SourceSql))set @i=charindex(@StrSeprate,@SourceSql)while @i>=1begininsert @temp values(left(@SourceSql,@i-1))set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)set @i=charindex(@StrSeprate,@SourceSql)endif @SourceSql<>'\'insert @temp values(@SourceSql)return endGO


 

原创粉丝点击