SQL脚本整理系列一 分隔函数
原来效果:
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脚本整理系列一 分隔函数的更多相关文章
- SQL脚本整理系列 三
触发器 SQL 2008 怎么实现删除学生表里面的一条记录,成绩表里面关于这个学生的记录也同时删掉,谢求具体代码 --创建表 DROP TABLE tstudent GO CREATE TABLE t ...
- SQL脚本整理系列一 表分区
表分区的目的: 1.把历史数据放到另外一个表里面 可以提高查询效率 当然如果经常查询历史数据和新数据的合并结果集这样做就大大的不好了 2.通过把一个表放到不同的文件,不同的文件再存储到不同的磁盘列阵中 ...
- 必杀技———SQL基础整理系列(一)
SQL(Structured Query Language)——结构化查询语言 SQL语言的组成部分 数据定义语言 (DDL:Data Definition Language) 负责数据结构定义与数据 ...
- SQL 脚本整理 笔记
1.视图 存储过程 触发器 批量加密(With Encryption),单个解密 在运行过程中自己找不到启用DAC 的地方,链接的时候需要在服务器名称前面添加ADMIN:,如本机是ADMIN:WP-P ...
- 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...
- Sql Server系列:排序函数
在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...
- [SQL SERVER系列]之常用函数和开窗函数介绍及实例
本文主要介绍SQL SERVER数据库中一些常用的系统函数及其SQL SERVER 2005以上支持的开窗函数. 1.常用函数 --从字符串右边截取指定字符数 select RIGHT('HELLO' ...
- MS SQL 中判断 数据库, 存储过程,表,临时表,视图,函数,用户,用户创建对象 等是否存在 SQL脚本
摘自: http://www.111cn.net/database/mssqlserver/39107.htm sql判断存储过程是否存在 判断数据库教程是否存在 Sql代码 if exists (s ...
- Jenkins系列之-—08 实现SQL脚本批量执行
公司内部推广DevOps,所有目前在维护阶段和开发阶段项目全部配置上了自动发布.采用Jenkins+SVN+ANT,之后批量执行SQL语句的实现提上日程 一.环境 Linux环境 安装ANT工具,且下 ...
随机推荐
- C# 根据论文 像素差异算法【个人实验还是比较好使的】
论文地址:http://www.docin.com/p-1081596986.html 具体代码: 我转YUV,再通过上面的论文的方式比较近. YVU 介绍:https://blog.csdn.net ...
- pycharm设置连接
https://blog.csdn.net/u013088062/article/details/50100121
- ubuntu命令行安装tomcat8
环境: 虚拟机VM14 Ubuntu16.04 java 1.8 步骤: 先更新 sudo apt-get update 然后安装: sudo apt-get install tomcat8 等一会 ...
- MongoDB 深入学习 -- ReplSet,Sharding,Security,Aggregation,Command
萌新最近在对付MongoDB,因此每天都在翻官方文档,这里随便做点笔记 ReplSet 与 Sharding ReplSet 是副本集,也就是主从集合.可以用来做负载均衡,数据热备份.副本集的配置相对 ...
- EF进阶篇(三)——上下文
前言 上下文,到底什么是上下文,且听我仔细吹来. 内容 在对EF实体进行关系操作的时候,第一步需要我们创建上下文实例对象,然后根据实体的变化进而通过上下文对该实体进行状态的修改,我的理解就是上下文就是 ...
- innerText、innerHTML
innerTest修改的是标签的文本内容,如果修改的字符串具有标签的格式,不会把标签展示到页面中 innerHtml打印标签中所有子标签 以字符串的形式,如果修改的字符串有标签的格式,则直接展示到页面 ...
- ajax的get,post ,封装
let ajax = new Object(); ajax.get = function(url,fn){ //创建ajax对象 let xhr = new XMLHttpRequest(); //与 ...
- 在libuv中使用openssl建立ssl连接
在libuv中使用openssl建立ssl连接 @(blogs) 使用openssl进行加密通信时,通常是先建立socket连接,然后使用SSL_XXX系列函数在普通socket之上建立安全连接,然后 ...
- MongoSQL 复制数据表报错
报错内容为: [thread1] SyntaxError: identifier starts immediately after numeric literal @(shell):1:2 解决方案: ...
- 4.jQuery和DOM 对象之间的相互转换
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...