SQL Server 中master..spt_values的应用
今天在做数据分析报表的时候遇到一个这样的问题。
表结构如下。
部门编码、部门名称、部门人员ID(中间用逗号分割)
我想通过和人员表链接,查询出一个新的数据集,查询出的结果集格式如下:
人员信息(ID或者姓名)、部门编码、部门名称
以前都是通过程序遍历拆分表字段组成新的集合字段,然后在结合SQL语句查询出结果集,但是这个报表要求只能通过SQL语句实现,以前记得可以通过写字段分割函数再结合游标实现。然而今天在网上无意间找到一个新的方法。用“master..spt_values”来实现,具体实现方法见下面实例1感觉这个东西太好用了。把网上的实例都整理了一下,希望各路大神批评指教,也希望大家继续把这方面的应用贴上.
- select number from master..spt_values with(nolock) where type='P'
- /**解释:master..spt_values表的字段值为P的对应number字段值是从0-2047*/
- --.将字符串转换为列显示
- if object_id('tb') is not null drop table tb
- go
- create table tb([编号] varchar(),[产品] varchar(),[数量] int,[单价] int,[金额] int,[序列号] varchar())
- insert into tb([编号],[产品],[数量],[单价],[金额],[序列号])
- select '','AA',,,,'12,13,14' union all
- select '','BB',,,,'22,23,24'
- go
- select [编号],[产品],[数量],[单价],[金额]
- ,substring([序列号],b.number,charindex(',',[序列号]+',',b.number)-b.number) as [序列号]
- from tb a with(nolock),master..spt_values b with(nolock)
- where b.number>= and b.number<len(a.[序列号]) and b.type='P'
- and substring(','+[序列号],number,)=','
- go
- drop table tb
- go
- /**
- 编号 产品 数量 单价 金额 序列号
- ---- ---- ----------- ----------- ----------- --------
- 001 AA 3 5 15 12
- 001 AA 3 5 15 13
- 001 AA 3 5 15 14
- 002 BB 8 9 13 22
- 002 BB 8 9 13 23
- 002 BB 8 9 13 24
- */
- ----------
- --.第四个逗号之前的字符串
- declare @str varchar()
- set @str='10,102,10254,103265,541,2154,41,156'
- ;with cte as(
- select left(@str,number-) as ss,row_number()over(order by getdate()) as xh
- from master..spt_values with(nolock)
- where number>= and number<=len(@str+',') and type='P'
- and substring(@str+',',number,)=','
- )select ss from cte where xh=
- /**
- ss
- -------------------
- 10,102,10254,103265
- */
- ----------
- --.找出两句话中相同的汉字
- declare @Lctext1 varchar()
- declare @Lctext2 varchar()
- set @Lctext1='我们都是来自五湖四海的朋友'
- set @Lctext2='朋友多了路真的好走吗'
- select substring(@Lctext2,number,) as value
- from master..spt_values with(nolock)
- where type='P' and number>= and number<=len(@Lctext2)
- and charindex(substring(@Lctext2,number,),@Lctext1,number)>
- /**
- value
- -----
- 朋
- 友
- 的
- */
- ---------
- --.提取两个日期之间的所有月份
- if object_id('tb') is not null drop table tb
- go
- create table tb(id int identity(,),startDate varchar(),endDate varchar())
- insert into tb(startDate,endDate) select '2013-01-01','2013-09-25'
- go
- declare @startDate varchar()
- declare @endDate varchar()
- select @startDate=startDate,@endDate=endDate from tb with(nolock)
- select convert(varchar(),dateadd(mm,number,@startDate),) as [月份]
- from master..spt_values with(nolock)
- where type='P' and number>=
- and dateadd(mm,number,@startDate)<=@endDate
- go
- drop table tb
- go
- /**
- 月份
- -------
- 2013-01
- 2013-02
- 2013-03
- 2013-04
- 2013-05
- 2013-06
- 2013-07
- 2013-08
- 2013-09
- */
- ---------
- --.求一个日期所在月份的所有日期
- declare @date datetime
- set @date='2013-08-31'
- select convert(char(),@date,)+'-'+right(''+convert(varchar(),number),) as [日期格式1]
- ,ltrim(year(@date))+right(+month(@date),)+right(''+ltrim(number),) as [日期格式2]
- from master..spt_values with(nolock)
- where type='P' and number>=
- --and number<=datediff(dd,@date,dateadd(mm,,@date)) --对于mssql而言该语句不试用于2013--31的情况,这时由于9月没有31号,固计算出来的天数是30天
- and number<=datediff(dd,convert(char(),@date,)+'-01',convert(char(),dateadd(mm,,@date),)+'-01')--转换为1号来计算天数
- /**
- 日期格式1 日期格式2
- ----------- --------------------
- 2013-08-01 20130801
- 2013-08-02 20130802
- 2013-08-03 20130803
- 2013-08-04 20130804
- 2013-08-05 20130805
- 2013-08-06 20130806
- 2013-08-07 20130807
- 2013-08-08 20130808
- 2013-08-09 20130809
- 2013-08-10 20130810
- 2013-08-11 20130811
- 2013-08-12 20130812
- 2013-08-13 20130813
- 2013-08-14 20130814
- 2013-08-15 20130815
- 2013-08-16 20130816
- 2013-08-17 20130817
- 2013-08-18 20130818
- 2013-08-19 20130819
- 2013-08-20 20130820
- 2013-08-21 20130821
- 2013-08-22 20130822
- 2013-08-23 20130823
- 2013-08-24 20130824
- 2013-08-25 20130825
- 2013-08-26 20130826
- 2013-08-27 20130827
- 2013-08-28 20130828
- 2013-08-29 20130829
- 2013-08-30 20130830
- 2013-08-31 20130831
- */
- ---------
- --.根据给定时间为基准以2小时为划分,得出一天划分出的时间段
- declare @time varchar()
- set @time='11:13'
- select ltrim(a.number)+right(@time,)+'-'+ltrim(b.number)+right(@time,) as [划分结果]
- from master..spt_values a with(nolock),master..spt_values b with(nolock)
- where a.type='P' and b.type='P'
- and a.number>=left(@time,) and b.number<=
- and a.number+=b.number
- /**
- 划分结果
- -----------------------------------
- 11:13-13:13
- 12:13-14:13
- 13:13-15:13
- 14:13-16:13
- 15:13-17:13
- 16:13-18:13
- 17:13-19:13
- 18:13-20:13
- 19:13-21:13
- 20:13-22:13
- 21:13-23:13
- 22:13-24:13
- */
- ---------
- --.将字符串显示为行列
- if object_id('tb') is not null drop table tb
- create table tb(id int identity(,),s nvarchar())
- insert into tb(s) select '车位地址1,车位状况1|车位地址2,车位状况2|车位地址n,车位状况n'
- ;with cte as(
- select substring(s,number,charindex('|',s+'|',number)-number) as ss
- from tb with(nolock),master..spt_values with(nolock)
- where type='P' and number>= and number<=len(s)
- and substring('|'+s,number,)='|'
- )select left(ss,charindex(',',ss)-)as s1,substring(ss,charindex(',',ss)+,len(ss))as s2 from cte
- drop table tb
- /**
- s1 s2
- ----------- ------------
- 车位地址1 车位状况1
- 车位地址2 车位状况2
- 车位地址n 车位状况n
- */
SQL Server 中master..spt_values的应用的更多相关文章
- 在SQL SERVER中实现RSA加解密函数(第二版)
/*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.5 注: 转载请保留此信息 更 ...
- 在SQL SERVER中实现RSA加解密函数(第一版)
/*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.1 注: 转载请保留此信息 ...
- SQL Server优化技巧之SQL Server中的"MapReduce"
日常的OLTP环境中,有时会涉及到一些统计方面的SQL语句,这些语句可能消耗巨大,进而影响整体运行环境,这里我为大家介绍如何利用SQL Server中的”类MapReduce”方式,在特定的统计情形中 ...
- SQL SERVER中变量的定义、赋值与使用
本文面向对SQL SERVER中变量操作不熟悉的用户,希望能使他们在看完本文后能对变量操作有具体和全面的认识. 在学习SQL SERVER的过程中,很多时候需要对某些单独的值进行调试,这时就需 ...
- SQL Server中的事务与锁
了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁: ...
- SQL Server 2008 master 数据库损坏解决总结
SQL Server 2008 master数据库损坏后,SQL SERVER服务启动失败,查看错误日志,你会看到下面错误信息: 2015-10-27 10:15:21.01 spid6s ...
- 在64位SQL Server中创建Oracle的链接服务器
当我们同时使用SQL Server和Oracle来存储数据时,经常会用到跨库查询.为了方便使用跨库查询,一个最好的办法就是通过创建链接服务器来实现.既可以在SQL Server中创建Oracle的链接 ...
- [转]细说SQL Server中的加密
简介 加密是指通过使用密钥或密码对数据进行模糊处理的过程.在SQL Server中,加密并不能替代其他的安全设置,比如防止未被授权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在 ...
- SQL Server中关于跟踪(Trace)那点事
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
随机推荐
- 如何在一个页面添加多个不同的kindeditor编辑器
kindeditor官方下载地址:http://kindeditor.net/down.php (入门必看)kindeditor官方文档:http://kindeditor.net/doc.ph ...
- 深度解析C语言int与unsigned int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...
- 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们之前的Asp.net mvc 开发中,一提到配置文件,我们不由的想到 web.config 和 app.config,在 ...
- 微信小程序demo理解
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Verdana } p.p2 { margin: 0.0px 0.0px 0.0px 0.0p ...
- 【Effective Java】9、使用EnumMap代替序数索引
package cn.xf.cp.ch02.item33; import java.util.EnumMap; import java.util.HashSet; import java.util.M ...
- 【工匠大道】Mac下Java开发环境配置简述
本文地址 原文地址 分享提纲: 1. 下载JDK1.7 2. 配置java_home 3 .安装tomcat 4 .安装eclipse或者myeclipse 5. mysql安装 破解版下载请参考M ...
- windows go安装
1.安装git 因为golang是通过git来管理远程包的,所以我们首先要安装git,下载地址:http://www.git-scm.com/download/. git安装比较简单,直接下一步即可( ...
- ZooKeeper原理及使用
ZooKeeper是Hadoop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调(Coordination)服务,与之对应的Google的类似服务叫Chubby.今天这篇 ...
- 禁止backspace键(退格键),但输入文本框时不禁止(兼容IE)
Ext实现方式: Ext.getDoc().on('keydown',function(e){ if(e.getKey() == 8 && e.getTarget().typ ...
- canvas贝塞尔曲线
贝塞尔曲线 Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线. 曲线定义:起始点.终止点.控制点.通过调整控制点,贝塞尔曲线的形状会发生变化. 1962年,法国数学家Pierr ...