学习使用master.dbo.spt_values表

本文介绍了如何使用SQL中的master.dbo.spt_values表来生成连续的日期序列,适用于需要在查询中创建日期列的情况。通过设置开始和结束日期,结合DATEDIFF和DATEADD函数,可以从该系统表中获取指定日期范围内的所有日期。
摘要由CSDN通过智能技术生成

如果要生成的临时表中有个连续的数字列,或者连续的日期列,如下所示:

2012-1-1

2012-1-2

2012-1-3

... ...

可以这样写:

declare @begin datetime,@end datetime
set @begin='2012-1-1'
set @end='2012-1-5'

declare @days int
set @days=DATEDIFF(dd,@begin,@end)
select DATEADD(dd,number,@begin) 
from master.dbo.spt_values 
where type='p' AND number<=@days

 

上面的语句中,@begin与@end可以认为是多外面传来的两个参数,我们要求这两个日期之间的日期序列。

当然,在看上面的代码之前最好先回顾一下master.dbo.spt_values表的数据。

select * from master.dbo.spt_values

我们使用了其中的type与number两列。

 

spt_values存储的是sybase的系统值。

master..spt_values相当于一个数字辅助表,在sql中主要用到number这个字段。

select  number  from  master..spt_values  where  type= 'p'
--这样查询一下就知道什么意思了
 
 
相对固定通用的取数字的表
主要作用就是取连续数字
不过有个缺陷就是只能取到2047

技术内幕系列丛书里面有介绍
 
 
这个表貌似是从DB2借用过来的,它存储了一些系统存储过程运行所需要的数据取值范围以前当前值,这个表共有名称,值,类型,最小,最大,状态等六个列,一个约束,一个聚集索引和一个非聚集索引.
网上找不到这个表结构所代表的含义,但从表的数据值来看,可以猜出一些来,比如,类型为B,那就应该是布尔型,它的名称和取值有四种,yes or no,no,yes,none.又如类型I似乎是与索引有关的一些数据名.你也可以通过名称及值的范围来猜出一些.
自然数序列0~2047的name为NULL,类型为p,猜不出这个p对应什么英文单词,或许在某个系统存储过程中要用它自然数序列,或许就是对应的这个存储过程名吧.
系统表中的东西,有些是要弄清楚的,而像spt_values这个表,联机丛书中都没有给出说明,那就是说它并不要求你知道它,我们只要知道能拿它来引用(比如类型p的数字序列)就足够了,而且,建议你不要试图去更改这个表的内容,否则可能会出现无法意料的后果. 
 
 
可以到安装文件里搜索 u_tables.sql 文件查看spt_values表注释情况

如下一段:

SQL code
 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值