今天在做数据分析报表的时候遇到一个这样的问题。

表结构如下。
部门编码、部门名称、部门人员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的应用的更多相关文章

  1. 在SQL SERVER中实现RSA加解密函数(第二版)

    /*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.5 注: 转载请保留此信息 更 ...

  2. 在SQL SERVER中实现RSA加解密函数(第一版)

    /*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.1 注:   转载请保留此信息 ...

  3. SQL Server优化技巧之SQL Server中的"MapReduce"

    日常的OLTP环境中,有时会涉及到一些统计方面的SQL语句,这些语句可能消耗巨大,进而影响整体运行环境,这里我为大家介绍如何利用SQL Server中的”类MapReduce”方式,在特定的统计情形中 ...

  4. SQL SERVER中变量的定义、赋值与使用

      本文面向对SQL SERVER中变量操作不熟悉的用户,希望能使他们在看完本文后能对变量操作有具体和全面的认识.   在学习SQL SERVER的过程中,很多时候需要对某些单独的值进行调试,这时就需 ...

  5. SQL Server中的事务与锁

    了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁: ...

  6. SQL Server 2008 master 数据库损坏解决总结

    SQL Server 2008 master数据库损坏后,SQL SERVER服务启动失败,查看错误日志,你会看到下面错误信息: 2015-10-27 10:15:21.01 spid6s      ...

  7. 在64位SQL Server中创建Oracle的链接服务器

    当我们同时使用SQL Server和Oracle来存储数据时,经常会用到跨库查询.为了方便使用跨库查询,一个最好的办法就是通过创建链接服务器来实现.既可以在SQL Server中创建Oracle的链接 ...

  8. [转]细说SQL Server中的加密

    简介 加密是指通过使用密钥或密码对数据进行模糊处理的过程.在SQL Server中,加密并不能替代其他的安全设置,比如防止未被授权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在 ...

  9. SQL Server中关于跟踪(Trace)那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

随机推荐

  1. 做个简单的RSS订阅(ASP.NET Core),节省自己的时间

    0x01 前言 因为每天上下班路上,午休前,都是看看新闻,但是种类繁多,又要自己找感兴趣的,所以肯定会耗费不少时间. 虽说现在有很多软件也可以订阅一些自己喜欢的新闻,要安装到手机,还是挺麻烦的.所以就 ...

  2. 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  3. 决策树ID3算法的java实现(基本试用所有的ID3)

    已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1 ...

  4. java 的持久化和序列化的简单理解

    1.对象的持久化(Persistence) 对象持久化就是让对象的生存期超越使用对象的程序的运行期.将对象存储在可持久保存的存储介质上,在实际应用中,运用相应的对象持久化框架,将业务数据以对象的方式保 ...

  5. webuploader上传文件,图片

    WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.官方地址:http://fex.baidu.com/webupload ...

  6. instanceof 运算符

    java中的instanceof=======>二元运算符 用法: result = object instanceof class 参数: result 是boolean类型 object 是 ...

  7. 兼容当前多浏览器的渐变颜色背景gradient的写法

    经常有一些时候需要使用渐变背景,使用长条图片有点太不高大上了,于是自己写了个小例子,兼容多浏览器就要为每一个浏览器写对应的CSS,太低版本的浏览器只能使用图片做背景. 下面是当前五大浏览器对gradi ...

  8. 【JS基础】数组

    filter() 返回数组中的满足回调函数中指定的条件的元素. array1.filter(callbackfn[, thisArg]) 对数组array1中的每个元素调用回调函数callbackfn ...

  9. JQuery中$.ajax()方法参数详解

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  10. 深入理解javascript选择器API系列第二篇——getElementsByClassName

    × 目录 [1]使用 [2]classList [3]扩展 前面的话 既然有getElementById()和getElementsByTagName()方法,为什么没有getElementsByCl ...