已知表格为
id   name
1  jame,job
2  carl,mc
3  paul
拆分为
id  name
1   jame
2   job
3   carl
4   mc
5   paul

----------------------------------------------------------------
--使用循环截取法
declare@tbtable(id intidentity(1,1),name char(50))
insert@tbselect'jame,job'
insert@tbselect'carl,mc'
insert@tbselect'paul'

declare c1 cursorforselect name from@tb
declare@tmptable(id intidentity(1,1),name char(50))
declare@schar(50)
open c1
fetch c1 into@s

while(@@fetch_status=0)
begin  
   whilecharindex(',',@s)>0
      begin
         insertinto@tmp
        values(left(@s,charindex(',',@s)-1))
         set@s=stuff(@s,1,charindex(',',@s),'')
      end
INSERT@tmpVALUES(@s)
fetch  nextfrom c1 into@s
end
select*from@tmp
close c1
deallocate c1
----------------------------------------------------------------
--使用动态SQL语句
declare@tbtable(id intidentity(1,1),name char(50))
insert@tbselect'jame,job'
insert@tbselect'carl,mc'
insert@tbselect'paul'

declare c1 cursorforselect name from@tb
declare@tmptable(id intidentity(1,1),name char(50))
declare@schar(50)
declare@sqlchar(8000)
open c1
fetch c1 into@s

while(@@fetch_status=0)
begin
  set@sql='select '''+replace(@s,',',''' union all select ''')+''''
   insertinto tmp --tmp只能是基本表,必须先定义好tmp的结构
     exec(@sql)
  fetch  nextfrom c1 into@s
end
select*from@tmp
close c1
deallocate c1

--> 测试数据: #T
ifobject_id('tempdb.dbo.#T') isnotnulldroptable #T
createtable #T (id int,name varchar(8))
insertinto #T
select1,'jame,job'unionall
select2,'paul,mc'unionall
select3,'carl';

--> 1. CTE 递归找分隔字符位置法:速度极快
with T (id,P1,P2) as
(
    select id,charindex(',',','+name),charindex(',',name+',')+1from #T
    unionall
    select a.id,b.P2,charindex(',',name+',',b.P2)+1from #T a join T b on a.id=b.id wherecharindex(',',name+',',b.P2)>0
)
select a.id,name=substring(a.name+',',b.P1,b.P2 - b.P1 -1) from #T a join T b on a.id=b.id orderby1
/*
id          name
----------- ---------
1           jame
1           job
2           mc
2           paul
3           carl
*/
--> 测试数据: #T
ifobject_id('tempdb.dbo.#T') isnotnulldroptable #T
createtable #T (id int,name varchar(8))
insertinto #T
select1,'jame,job'unionall
select2,'paul,mc'unionall
select3,'carl';

--> 2. 临时表法:速度比CTE方法相差无几
ifobject_id('tempdb.dbo.#') isnotnulldroptable #
selecttop8000 id=identity(int,1,1) into # from syscolumns,sysobjects --> select max(len(name)) from #T=11
select a.id,name=substring(a.name+',',b.id,charindex(',',a.name+',',b.id+1)-b.id) from #T a innerjoin # b onsubstring(','+a.name,b.id,1)=','
/*
id          name
----------- ---------
1           jame
1           job
2           mc
2           paul
3           carl
*/

3. XML法:速度较慢
select
    a.id,b.name
from
    (select id,name=convert(xml,'<root><v>'+replace(name,',','</v><v>')+'</v></root>') from #T ) a
outer apply
    (select name=N.v.value('.','varchar(100)') from a.name.nodes('/root/v') N(v)) b
/*
id          name
----------- ---------
1           jame
1           job
2           mc
2           paul
3           carl
*/

转载于:https://www.cnblogs.com/Qiaoyq/archive/2012/09/27/2706067.html

SQL Server 字符串拆分相关推荐

  1. sql server字符串替换函数REPLACE

    使用REPLACE(替换字符串)函数REPLACE函数将字符串中的子字符串替换为指定字符串. 语法: REPLACE (string_expression1, string_expression2, ...

  2. SQL SERVER 字符串函数 STRING_SPLIT()

    定义: STRING_SPLIT()函数根据指定的分隔符将字符串拆分为子字符串行. ※STRING_SPLIT 要求兼容性级别至少为 130. (即SSMS 2016及以上版本) ※级别低于 130 ...

  3. Sql Server 字符串操作总结

    SQL Server 支持两种字符数据类型---常规和Unicode:常规类型包括char 和varchar:unicode包括nchar 和nvarchar.常规的每个字符占用一个字节存储,而uni ...

  4. SQL Server 字符串操作

    为什么80%的码农都做不了架构师?>>>    ... 参考文档 [官方]LEFT (Transact-SQL) [官方]RIGHT (Transact-SQL) [官方]SUBST ...

  5. SQL Server字符串左匹配

    在SQL Server中经常会用到模糊匹配字符串的情况,最简单的办法就是使用like关键字(like语法http://msdn.microsoft.com/en-us/library/ms179859 ...

  6. Sql Server 字符串、日期函数 收藏

    /**//*************************************************************************** DATEPART 返回代表指定日期的指 ...

  7. Sql Server 字符串、日期函数

    /**//*************************************************************************** DATEPART 返回代表指定日期的指 ...

  8. SQL Server字符串聚合拼接列值合并

    STUFF字符串函数是将字符串插入到另一个字符串中.它会删除开始位置第一个字符串中的指定长度的字符,然后将第二个字符串插入到开始位置的第一个字符串中,语法如下: STUFF(字符串/变量/列,开始位置 ...

  9. Sql Server字符串函数

    字符串函数用于对字符和二进制字符进行各种操作 1.ASCII()函数  ASCII(character_expression)函数用于返回字符串表达式中最左侧的ASCII代码值.参数character ...

  10. sql server 字符串转table

    -- ============================================= -- Author: gengc -- Create date: <2012-12-29> ...

最新文章

  1. 深度学习的发展可能已达极限!
  2. pyvmomi 实现VMware自动化
  3. 从源码分析DEARGUI之add_menu
  4. 查询添加条件_035 JAVA-MySQL 约束、DML操作(增改删)、事务处理、查询数据
  5. es查询index生成时间_Elasticsearch第二谈(ES核心概念、ES简单操作、构建查询、查询结果过滤排序分页、term和match查询区别、自定义查询结果高亮)...
  6. UEFI下用rufus安装ubuntu16.04 LTS
  7. Java中的属性和方法
  8. linux安装phpunit,linux下安装phpunit
  9. IntelliJ IDEA 8.1.3 Web开发视频教程
  10. PWA进阶:Service Worker一问一答
  11. 【转】 CSS3实现10种Loading效果
  12. C++ 中map容器
  13. select weui 动态加载数据_jQuery WeUI 组件下拉刷新和滚动加载的实现
  14. s3c6410 开发板Linux系统支持 K9GAG08U0E的方法(第二篇)
  15. LaTeX 文档类型
  16. 新技术在支付清算行业的创新应用
  17. 华三s3100v3时区配置_H3C S3100V3-SI交换机设置NTP时间
  18. 神经机器翻译(Neural machine translation, NMT)学习笔记
  19. 二维码技术在证卡上的应用
  20. Aop简介 Aop术语 SpringAOP

热门文章

  1. iOS----------APP怎样做更安全
  2. form表单提交数据
  3. struts2 + spring + mybatis 框架整合
  4. 8.9. 最大连续子段和,以及循环最大连续子段和。
  5. 百度Hi Csrf蠕虫攻击
  6. ionic3 打包错误解决:Could not resolve all files for configuration ':classpath'.
  7. 潍坊首个小学“教育创客空间”落户呼家庄小学 萝卜(创客)教育走进小学课堂...
  8. 信息安全产业爆发在即 十三五年均增长将达20%以上
  9. 查询一个表插入数据的时间,按BLOCK时间
  10. Eclipse的界面语言