原来效果:

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. 指针和动态分配内存 (不定长度数组)------新标准c++程序设计

    背景: 数组的长度是定义好的,在整个程序中固定不变.c++不允许定义元素个数不确定的数组.例如: int n; int a[n]; //这种定义是不允许的 但是在实际编程中,往往会出现要处理的数据数量 ...

  2. conda install 安装太慢怎么办?

    小编我在安装tensorflow和keras的过程中,安装进程太慢,小木棍一直在转圈...抓狂... 如何解决??? 使用清华提供的anaconda镜像,使用以后真的很快! Anaconda 镜像使用 ...

  3. YARN 的调度选项

    YARN 中有三种调度器: 1. FIFO 调度器 (FIFO Scheduler) 应用在一个队列中,按照提交的顺序运行应用. 缺点:小作业如果在大作业后面提交,将会一直等到大作业结束才运行. 2. ...

  4. jmeter函数助手(_random、_time)

    jmeter函数助手 __random __time yyyyMMddHHmmdd  时间格式(年月日时分秒) 1.打开函数助手对话框,选项->函数助手对话框 2.生成函数字符串 (1)选择功能 ...

  5. 简单使用postman

    一.get请求 获取学生信息接口文档内容: 简要描述: 获取学生信息接口 请求URL: http://ip/api/user/stu_info 请求方式: get 参数: 参数名 必选 类型 说明 s ...

  6. SDUT OJ 数据结构实验之图论八:欧拉回路

    数据结构实验之图论八:欧拉回路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  7. CentOS 7 基础网络配置

    基础的网络配置,包括静态IP地址.子网掩码.网关.DNS,使用 nmtui 和 nmcli 工具时必须开启 NetworkManager 服务 文本用户界面工具 nmtui [root@localho ...

  8. 教你搭建SpringSecurity3框架(附源码)

    源码下载地址:http://pan.baidu.com/s/1qWsgIg0 一.web.xml <?xml version="1.0" encoding="UTF ...

  9. P4381 [IOI2008]Island

    传送门 显然题目给的图构成一个基环树森林 对于每个基环树单独考虑,显然每个都走直径是最优的 考虑如何求出基环树的直径 把直径分为两种情况考虑,首先可以找出环 因为直径可能不在环边上,所以对每个环上节点 ...

  10. POJ - 3263 差分+前缀和

    只需不断维护相对值的前缀就能得到解 这种思想第一次是在树状数组区间更新那里看到的,由于题目要求是1~n所以直接可以用前缀和维护 注意不能直接-1 +1 还有POJ的数据..要不是书里有提谁知道会这么毒 ...