• 转载:在SQL SERVER中实现SPLIT


    sqlserver字符串拆分(split)方法汇总

    --方法0:动态SQL法
    declare @s varchar(100),@sql varchar(1000)
    set @s='1,2,3,4,5,6,7,8,9,10'
    set @sql='select col='''+ replace(@s,',',''' union all select ''')+''''
    PRINT @sql
    exec (@sql)

     

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO
    --方法1:循环截取法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
     DECLARE @splitlen int
     SET @splitlen=LEN(@split+'a')-2
     WHILE CHARINDEX(@split,@s)>0
     BEGIN
      INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
      SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
     END
     INSERT @re VALUES(@s)
     RETURN
    END
    GO

     

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO
    --方法2:使用临时性分拆辅助表法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),  --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
     --创建分拆处理的辅助表(用户定义函数中只能操作表变量)
     DECLARE @t TABLE(ID int IDENTITY,b bit)
     INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b

     INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)
     FROM @t
     WHERE ID<=LEN(@s+'a') 
      AND CHARINDEX(@split,@split+@s,ID)=ID
     RETURN
    END
    GO

     

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tb_splitSTR]') and objectproperty(id,N'IsUserTable')=1)
    drop table [dbo].[tb_splitSTR]
    GO
    --方法3:使用永久性分拆辅助表法
    --字符串分拆辅助表
    SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR
    FROM syscolumns a,syscolumns b
    GO
    --字符串分拆处理函数
    CREATE FUNCTION f_splitSTR(
    @s     varchar(8000),  --待分拆的字符串
    @split  varchar(10)     --数据分隔符
    )RETURNS TABLE
    AS
    RETURN(
     SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))
     FROM tb_splitSTR
     WHERE ID<=LEN(@s+'a') 
      AND CHARINDEX(@split,@split+@s,ID)=ID)
    GO

     

    --方法4:利用sql server2005的OUTER APPLY

    CREATE FUNCTION [dbo].[ufn_SplitStringToTable]
    (
      @str VARCHAR(MAX) ,
      @split VARCHAR(10)
    )
    RETURNS TABLE
        AS 
    RETURN
        ( SELECT    B.id
          FROM      ( SELECT    [value] = CONVERT(XML , '<v>' + REPLACE(@str , @split , '</v><v>')
                                + '</v>')
                    ) A
          OUTER APPLY ( SELECT  id = N.v.value('.' , 'varchar(100)')
                        FROM    A.[value].nodes('/v') N ( v )
                      ) B
        )

     

    备注说明:

    方法4必须在sql server2005下才可以运行

    原文地下:http://www.cnblogs.com/aierong/archive/2008/11/19/sqlserver_split.html 
     

  • 相关阅读:
    九度oj 题目1465:最简真分数
    九度oj 题目1083:特殊乘法 清华大学2010年机试题目
    九度oj 题目1084:整数拆分 清华大学2010年机试题目
    九度oj 题目1085:求root(N, k) 清华2010年机试题目
    九度oj 题目1460:Oil Deposit
    九度oj 题目1459:Prime ring problem
    九度oj 题目1458:汉诺塔III
    九度oj 题目1457:非常可乐
    题目1451:不容易系列之一
    移动端滚动不流畅,添加-webkit-overflow-scrolling属性 值为touch
  • 原文地址:https://www.cnblogs.com/lgzslf/p/2795068.html
Copyright © 2020-2023  润新知