--方法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

SQL模仿Split 功能的更多相关文章

  1. sql server 实现split功能 行转列

    --實現split功能的函數create function [dbo].[func_split]( @SourceSql varchar(max), @StrSeprate varchar(10))r ...

  2. SQL Server 数据加密功能解析

    SQL Server 数据加密功能解析 转载自: 腾云阁 https://www.qcloud.com/community/article/194 数据加密是数据库被破解.物理介质被盗.备份被窃取的最 ...

  3. SQL Server2016 新功能实时查询统计信息

    SQL Server2016 新功能实时查询统计信息 很多时候有这样的场景,开发抱怨DBA没有调优好数据库,DBA抱怨开发写的程序代码差,因此,DBA和开发都成为了死对头,无法真正排查问题. DBA只 ...

  4. SQL Server 安装 功能详解

    安装 SQL Server 功能     在“功能选择”页上,SQL Server 功能分为以下两个主要部分:实例功能和共享功能. “实例功能”表示为每个实例安装一次的组件,这样,您将具有它们的多个副 ...

  5. SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)

    原文:SQL Server审计功能入门:SQL Server审核 (SQL Server Audit) 介绍 Audit是SQL Server 2008之后才有的功能,它能告诉你"谁什么时候 ...

  6. SQL Server审计功能入门:更改跟踪(Change Tracking)

    原文:SQL Server审计功能入门:更改跟踪(Change Tracking) 介绍 更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制.常规的,自定义变更跟踪和读取跟踪数据, ...

  7. SQL Server审计功能入门:CDC(Change Data Capture)

    原文:SQL Server审计功能入门:CDC(Change Data Capture) 介绍 SQL Server 2008引入了CDC(Change Data Capture),它能记录: 1. ...

  8. 腾讯云数据库团队:SQL Server 数据加密功能解析

    数据加密是数据库被破解.物理介质被盗.备份被窃取的最后一道防线:数据加密,一方面解决数据被窃取安全问题,另一方面有关法律要求强制加密数据:SQL Server 的数据加密相较于其他数据库,功能相对完善 ...

  9. DB查询分析器7.01新增的周、月SQL执行计划功能

                DB查询分析器7.01新增的周.月SQL执行计划功能 马根峰              (广东联合电子服务股份有限公司, 广州 510300) 1      引言   中国本土 ...

随机推荐

  1. javascript的document中的动态添加标签

    document的高级篇中提供了节点操作的函数,具体包括:获取节点,改变节点,删除节点,替换节点,创建节点,添加节点,克隆节点等函数.我们可以利用这些函数动态改变html的节点. 1.JavaScri ...

  2. int类型的正负数转换

    int aid = -this.id; 不能直接转 必须先赋值给一个变量 int c = this.id; int a = c * (-1); this.id = a;

  3. Linux C 文件输入输出函数 fopen()、getc()/fgetc()、putc()/fputc()、fclose()、fprintf()、fscanf()、fgets()、fputs()、fseek()、ftell()、fgetpos()、fsetpos() 详解

      fopen(打开文件) 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参 ...

  4. 微信公共服务平台开发(.Net 的实现)12-------网页授权(上 :更加深入理解OAuth2.0 )

    我们首先来认识一下OAuth协议吧,这个东西很早就听说过,总觉得离我很远(我的项目用不到这些),但是最近不得不学习一下了.我在网上找了一些解释,认为解释的最好的是这样说的(出处:http://hi.b ...

  5. Matlab学习笔记(一)—— 三维图形绘制

    这学期公选课选的是MATLAB,所以准备把这学期所学习的整理到博客上,作为记录,哇咔咔~ 一.三维函数图: x=cos(t), y=sin(t), z=t %≤t ≤*pi t=:*pi; %t的取值 ...

  6. Burpsuite+sqlmap批量扫描sql漏洞

    1.burpsuite设置导出log n'd'k 输入文件名保存 2.sqlmap批量扫描     python sqlmap.py -l 文件名 --batch -smart     batch:自 ...

  7. Retroactive priority queues

    http://erikdemaine.org/papers/Retroactive_TALG/paper.pdf 明天写..大概就是通过一些结论发现这个东西其实就是往最后的集合里加入或删除一些可以被快 ...

  8. java4

    1:如何制作帮助文档(了解) (1)写一个类 (2)加入文档注释 (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.java 2: ...

  9. Path

    <Path Data="M17.5,16.5 L17.5,18.5 19.5,18.5 19.5,16.5 z M11.5,16.5 L11.5,18.5 13.5,18.5 13.5 ...

  10. ABAP 客户报表

    *&---------------------------------------------------------------------* *& Report  ZSDR014 ...