--方法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. jvm死锁解决

    那我们怎么确定一定是死锁呢?有两种方法. 1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开. 1)连接到需要查看的进程.

  2. shell--4.echo和printf

    1. echo (1) echo ,显示普通字符串 echo "HelloWorld" 打印:HelloWorld (2) \ ,显示转义字符串 echo "\" ...

  3. IE 8 下的 box-sizing 和 min-* 属性

    在非 IE 浏览器中,默认情况下 width 属性指的是内容区域(content)的宽度. IE 6+ 中,如果浏览器以标准模型渲染,和非 IE 浏览器的表现是一致的:如果浏览器以怪癖模式渲染,则 w ...

  4. JavaScript "自"运行-setInertval()和setTimeout()理解

    setInterval()和clearInterval() var result = "Y"; function onOk() { var tid = setInterval(fu ...

  5. java23

    1:多线程(理解)    (1)多线程:一个应用程序有多条执行路径        进程:正在执行的应用程序        线程:进程的执行单元,执行路径        单线程:一个应用程序只有一条执行 ...

  6. mongoTemplate简单用法(增删改查)

    分页时查找数量: public long countSample(String id) { Query query = new Query(); if (StringUtil.hasText(id)) ...

  7. Qt: 时钟Demo

    其实是一个很简单的Demo,可以编译了拿NSIS打包.最近在做富文本编辑器和补C++不记得的东西吧,项目遥遥无期. //clock.pro #----------------------------- ...

  8. Select标签下拉列表二级联动级联

    首先从服务器端,绑定下拉列表,二级下拉的text命名按照一定规则加上一级下拉的ID. var options=new Array(); $(document).ready(function(){ // ...

  9. linux操作oracle

    1.su - oracle 2.sqlplus / as sysdba; 1.登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切换成oracle用 ...

  10. Tcl

    Tcl(发音 tickle)是一种脚本语言.由John Ousterhout创建.TCL经常被用于快速原型开发 RAD.脚本编程.GUI编程和测试等方面. Expect Expect是 另外一种非常流 ...