zoukankan      html  css  js  c++  java
  • 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)
    --方法1:循环截取法
    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
    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

     --方法2:使用临时性分拆辅助表法

    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
    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下才可以运行

    转:aierong原创技术随笔  sqlserver字符串拆分(split)方法汇总

  • 相关阅读:
    自己写的一个ASP.NET服务器控件Repeater和GridView分页类
    c#Udp分包组包方法
    利用反射写的,可以插件的俄罗斯方块
    冰之随笔一(c#反射、特性)
    Socket的简单例子
    HTTP状态码
    C# WebService 基础实例
    Win7上IIS发布网站系统部署项目
    FileUpload 简单上传+小预览
    .net 验证码
  • 原文地址:https://www.cnblogs.com/wangfuyou/p/5854218.html
Copyright © 2011-2022 走看看