原来效果:

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 

SQL脚本整理系列一 分隔函数的更多相关文章

  1. SQL脚本整理系列 三

    触发器 SQL 2008 怎么实现删除学生表里面的一条记录,成绩表里面关于这个学生的记录也同时删掉,谢求具体代码 --创建表 DROP TABLE tstudent GO CREATE TABLE t ...

  2. SQL脚本整理系列一 表分区

    表分区的目的: 1.把历史数据放到另外一个表里面 可以提高查询效率 当然如果经常查询历史数据和新数据的合并结果集这样做就大大的不好了 2.通过把一个表放到不同的文件,不同的文件再存储到不同的磁盘列阵中 ...

  3. 必杀技———SQL基础整理系列(一)

    SQL(Structured Query Language)——结构化查询语言 SQL语言的组成部分 数据定义语言 (DDL:Data Definition Language) 负责数据结构定义与数据 ...

  4. SQL 脚本整理 笔记

    1.视图 存储过程 触发器 批量加密(With Encryption),单个解密 在运行过程中自己找不到启用DAC 的地方,链接的时候需要在服务器名称前面添加ADMIN:,如本机是ADMIN:WP-P ...

  5. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  6. Sql Server系列:排序函数

    在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...

  7. [SQL SERVER系列]之常用函数和开窗函数介绍及实例

    本文主要介绍SQL SERVER数据库中一些常用的系统函数及其SQL SERVER 2005以上支持的开窗函数. 1.常用函数 --从字符串右边截取指定字符数 select RIGHT('HELLO' ...

  8. MS SQL 中判断 数据库, 存储过程,表,临时表,视图,函数,用户,用户创建对象 等是否存在 SQL脚本

    摘自: http://www.111cn.net/database/mssqlserver/39107.htm sql判断存储过程是否存在 判断数据库教程是否存在 Sql代码 if exists (s ...

  9. Jenkins系列之-—08 实现SQL脚本批量执行

    公司内部推广DevOps,所有目前在维护阶段和开发阶段项目全部配置上了自动发布.采用Jenkins+SVN+ANT,之后批量执行SQL语句的实现提上日程 一.环境 Linux环境 安装ANT工具,且下 ...

随机推荐

  1. 网页的js源文件被加密解决方案

    Firefox和Chrome都具有这个功能,而且位置几乎一致

  2. WPF 动态更换模板

    Window x:Class="模板选择器.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml ...

  3. react.js学习之路五

    最近没时间写博客,但是我一直在学习react,我发现react是一个巨大的坑,而且永远填不完的坑 关于字符串的拼接: 在react中,字符串的拼接不允许出现双引号“” ,只能使用单引号' ',例如这样 ...

  4. ASPxGridView后台实现隐藏新增按钮

    (ASPxGridView2.Columns[0] as GridViewCommandColumn).NewButton.Visible = false;//0应该代表的是NewButton所在的列 ...

  5. CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境【转载】

    本文转载自 园友David_Tang的博客,如有侵权请联系本人及时删除,原文地址: http://www.cnblogs.com/mchina/archive/2012/11/28/2778779.h ...

  6. Struts、Hibernate和Spring的整合

    Spring整合Hibernate Spring以其开放性,能与大部分ORM框架良好的整合.这样Spring就能轻松地使用ORM. Spring提供了DAO支持,DA0组件是应用的持久层访问的重要组件 ...

  7. zabbix 3.0 快速安装文档

    下载地址:http://www.zabbix.com/download.php 官方文档:https://www.zabbix.com/documentation/3.0/manual/install ...

  8. bash: ./AdobeAIRInstaller.bin: No such file or directory

    # chmod a+x AdobeAIRInstaller.bin # ./AdobeAIRInstaller.binbash: ./AdobeAIRInstaller.bin: No such fi ...

  9. (STM32F4) Real-time Clock

    老實說Real-time Clok這項功能,我也只有在PC和手機上有見過,其他的應用產品上我也很少見到. 言歸正傳在STM32F4 RTC這項功能在IC內部就有內建,在早期的8051是如果要做RCT是 ...

  10. zbar

    源码下载链接:http://sourceforge.net/projects/zbar