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

最新文章

  1. 卷积神经网络(CNN)学习算法之----基于LeNet网络的中文验证码识别
  2. cell 的复用机制
  3. 编写高质量代码改善C#程序的157个建议[勿选List&lt;T&gt;做基类、迭代器是只读的、慎用集合可写属性]
  4. 九度OJ 1544 数字序列区间最小值
  5. VB VS2003获取当前进程用户登录
  6. 安装Laravel遇到You must enable the openssl extension to download files via https问题
  7. Little Busters! — 并查集
  8. python版本wifi共享工具
  9. CCNA网络工程师学习进程(7)路由器的路由配置
  10. matlab中axis的使用
  11. sizeof和strlen的区别和联系总结
  12. 分布式进阶(十八) 分布式缓存之Memcached
  13. “ORA-12154: TNS: 无法解析指定的连接标识符”错误解决办法
  14. mac 下mysql安装
  15. flask多个app应用组合
  16. Spark程序数据结构优化
  17. 字符串、字节数组、流之间的相互转换以及文件MD5的计算
  18. sudo操作
  19. PAT1018 (dijkstra+dfs)
  20. pandas 常用函数整理

热门文章

  1. AJAX 请求区分 $_SERVER[&#39;HTTP_X_REQUESTED_WITH&#39;] 小解
  2. Hibernate一对一、一对多、多对多注解映射配置
  3. 浅谈JS之AJAX
  4. oracle查询某一个字段的数量总和
  5. MVC学习笔记
  6. 【krpano】汉化Web VR设置界面
  7. VC++ CString类完美总结(整理)
  8. 【python】确保文件写入结束
  9. css div上下左右居中
  10. caffe下训练时遇到的一些问题汇总