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工具,且下 ...
随机推荐
- vi/vim使用总结
第一部份:一般模式可用的按钮说明,光标移动.复制粘贴.搜索取代等 移动光标的方法: h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移劢一个字符 k 或 向上箭头键( ...
- jQuery定位导航滚动3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 月薪3万+的大数据人都在疯学Flink,为什么?
身处大数据圈近5年了,在我的概念里一直认为大数据最牛的两个东西是Hadoop和Spark.18年下半年的时候,我突然发现身边很多大数据牛人都是研究学习Flink,甚至连Spark都大有被冷落抛弃的感觉 ...
- 选课 树形背包dp
题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...
- WPF 仿IPhone滑块开关 样式 - CheckBox
原文:WPF 仿IPhone滑块开关 样式 - CheckBox <Style x:Key="CheckRadioFocusVisual"> <Setter Pr ...
- 转载---<html>与<body>
关于根元素html以及body的对比,主要是遇到设置背景色的问题,这里转载张鑫旭的关于html和body对比的文.(直接贴过来,是为了以后自己方便看) 原文地址:http://www.zhangxin ...
- 说说Cookie和Session(会话)的区别?
1.Cookie 通俗讲,是访问某些网站后在本地存储的一些网站相关信息,下次访问时减少一些步骤.更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器,是在客户 ...
- C++_基础4-分支语句和逻辑运算符
这一部分截取自<C++ Primer Plus>,内容比较简单,很多只取了一些主题关键词,有空再补充: 设计智能程序的一个关键是使程序具有决策能力. 前面一种方式是循环——程序决定是否继续 ...
- MITK 手册
可怜这么有用的开源竟然没有中文手册, MITK Plugin Manuals Overview The Basic Image Processing Plugin The DataManager ...
- AES/ECB/NoPadding 加减密
package unit; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache. ...