原来效果:

fName    Scroe
王某某 101,102,109
李某某 102,103
王某某 103
李某某
李某某 101,102,103
王某某 222

执行后效果:

name    score
李某某 101
李某某 102
李某某 103
王某某 101
王某某 102
王某某 103
王某某 109
王某某 222

--基础数据表创建

IF OBJECT_ID('Test1') >0
DROP TABLE dbo.Test1 CREATE TABLE Test1
(
fName NVARCHAR(10) ,
Scroe VARCHAR(50)
); INSERT dbo.Test1
( fName, Scroe )
VALUES ( N'王某某', -- fName - nvarchar(10)
'101,102,109' -- Scroe - varchar(50)
)
INSERT dbo.Test1
( fName, Scroe )
VALUES ( N'李某某', -- fName - nvarchar(10)
'102,103' -- Scroe - varchar(50)
)
INSERT dbo.Test1
( fName, Scroe )
VALUES ( N'王某某', -- fName - nvarchar(10)
'' -- Scroe - varchar(50)
)
INSERT dbo.Test1
( fName, Scroe )
VALUES ( N'李某某', -- fName - nvarchar(10)
'' -- Scroe - varchar(50)
)
INSERT dbo.Test1
( fName, Scroe )
VALUES ( N'李某某', -- fName - nvarchar(10)
'101,102,103' -- Scroe - varchar(50)
)
INSERT dbo.Test1
( fName, Scroe )
VALUES ( N'王某某', -- fName - nvarchar(10)
'' -- Scroe - varchar(50)
) SELECT * FROM Test1
--DECLARE @Scroe VARCHAR(max)

--创建分隔函数

 IF OBJECT_ID('getSplitResult') > 0
DROP FUNCTION getSplitResult
GO /*
分隔函数 */ CREATE FUNCTION dbo.getSplitResult
(
@SourceObject VARCHAR(MAX) ,--源对象
@Split VARCHAR(1) = ','--分隔参数
)
--返回一个表
RETURNS @tb TABLE ( score VARCHAR(10) )
AS
BEGIN
--不含分隔符
IF CHARINDEX(@Split, @SourceObject) = 0
INSERT @tb
( score )
VALUES ( @SourceObject -- score - varchar(10)
); WHILE ( CHARINDEX(@Split, @SourceObject) > 0 )
BEGIN
--插入数据
INSERT @tb
( score
)
VALUES ( SUBSTRING(@SourceObject, 0,
CHARINDEX(@Split, @SourceObject)) -- score - varchar(10)
); SET @SourceObject = RIGHT(@SourceObject,
LEN(@SourceObject)
- CHARINDEX(@Split, @SourceObject)) IF ( CHARINDEX(@Split, @SourceObject) = 0
AND LEN(@SourceObject) <> 0
)
INSERT @tb
( score )
VALUES ( @SourceObject -- score - varchar(10)
);
END RETURN
END

--创建存储过程

IF OBJECT_ID('sp_SplitResult') > 0
DROP PROC sp_SplitResult
GO CREATE PROC sp_SplitResult
AS
BEGIN
--声明一个表
SET NOCOUNT ON
DECLARE @tb TABLE
(
name VARCHAR(20) ,
score VARCHAR(10)
)
DECLARE @name VARCHAR(20)= '' ,
@SourceObject VARCHAR(MAX) --创建游标
DECLARE cursor_tb CURSOR FAST_FORWARD
FOR
( SELECT fName ,
Scroe
FROM dbo.Test1
WHERE Scroe <> ''
)
OPEN cursor_tb
FETCH NEXT FROM cursor_tb
INTO @name, @SourceObject; WHILE @@FETCH_STATUS = 0
BEGIN
INSERT @tb
SELECT @name ,
score
FROM dbo.getSplitResult(@SourceObject, ',')
FETCH NEXT FROM cursor_tb
INTO @name, @SourceObject END CLOSE cursor_tb
DEALLOCATE cursor_tb SELECT DISTINCT
*
FROM @tb
END -- EXEC sp_SplitResult

--执行结果

EXEC sp_SplitResult 

最新文章

  1. Shared pool
  2. [Emacs] 常用快捷键-- 生存指南
  3. -aborted-exception-during-the-exce
  4. 结合Git实现Mysql差异备份,可用于生产环境
  5. 升级 CentOS git 1.7.1 到 1.7.12
  6. Mac 10.9 自带apache2虚拟目录设置
  7. L005-oldboy-mysql-dba-lesson05
  8. HTML5移动开发中的input输入框类型
  9. Regex sumologic
  10. 整理网站优化(SEO)的方案
  11. RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World
  12. spring core 与 context理解
  13. 保存配置,获取配置,XML
  14. JS----对象的合并与克隆
  15. ABP 番外篇-菜单
  16. [C++]Linux之文件拷贝在系统调用和C库函数下的效率比较
  17. Java8新特性interface中的static方法和default方法
  18. Spring容器AOP的实现原理——动态代理(转)
  19. Matlab基础部分2-数组和矩阵分析
  20. CURLcode的定义

热门文章

  1. 「HNOI2008」越狱
  2. Response Assertion(响应断言)
  3. docker容器管理及网络管理
  4. 简单的 socket 代码
  5. 【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回
  6. centos安装mysql57
  7. HDU-1431-素数回文(暴力打表)
  8. SpringCloud文章
  9. C#直接使用DllImport外部Dll的方法
  10. 洛谷 P1486 [NOI2004]郁闷的出纳员