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

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,0 ,'P  ' ,1 ,0x00000001 ,0)
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,1 ,'P  ' ,1 ,0x00000002 ,0)
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,2 ,'P  ' ,1 ,0x00000004 ,0)
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,3 ,'P  ' ,1 ,0x00000008 ,0)
 
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,4 ,'P  ' ,1 ,0x00000010 ,0)
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,5 ,'P  ' ,1 ,0x00000020 ,0)
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,6 ,'P  ' ,1 ,0x00000040 ,0)
insert spt_values (name ,number ,type ,low ,high ,status) values (null ,7 ,'P  ' ,1 ,0x00000080 ,0)
 
go
 
-- 'P  ' continued....
declare
     @number_track        integer
    ,@char_number_track    varchar(12)
 
select     @number_track        = 7
select     @char_number_track    = convert(varchar,@number_track)
 
-- max columns is 1024 so we need 1024 bit position rows;
-- we'll actually insert entries for more than that
while @number_track < 1024
    begin
 
    raiserror('type=''P  '' ,@number_track=%d' ,0,1 ,@number_track)
 
    EXECUTE(
    '
    insert spt_values (name ,number ,type ,low ,high ,status)
      select
         null
 
        ,(select     max(c_val.number)
            from     spt_values    c_val
            where     c_val.type = ''P  ''
            and     c_val.number between and ' + @char_number_track + '
         )
            + a_val.number + 1
 
        ,''P  ''
 
        ,(select     max(b_val.low)
            from     spt_values    b_val
            where     b_val.type = ''P  ''
            and     b_val.number between and ' + @char_number_track + '
         )
            + 1 + (a_val.number / 8)
 
        ,a_val.high
        ,0
        from
         spt_values    a_val
        where
         a_val.type = ''P  ''
        and     a_val.number between and ' + @char_number_track + '
    ')
 
 
    select @number_track = ((@number_track + 1) * 2) - 1
    select @char_number_track = convert(varchar,@number_track)
 
    end --loop
go

 

 
 
 
master..spt_values 相当于 master.dbo.spt_values

master 是数据库名
spt_values是表名

spt_values 是一张常量表  系统表
 
该表是从sybase继承过来的,是个内部字典表,供SQL Server内部使用。
我们可以在许多系统存储过程和函数的源代码中发现它的身影。其实可以将它理解成我们编程时常用的数据字典.

列名分别为名称、值、类型、下限、上限、状态;

类型列的取值含义:
D=Database Option P=Projection DBR=Database Role DC=Database Replication I=Index L=Locks V=Device Type
因为比较多,无法一一列举。其中类型P较为特殊,它只是0-2047(与版本有关)之间的数字的简单列表,作为对所有类型之间关系的预测。

 
 
select number from master..spt_values with(nolock) where type='P'
/**解释:master..spt_values表的字段值为P的对应number字段值是从0-2047*/ 
 
 
 

select MONTH(convert(varchar(10), dateadd(MONTH, number - 1,
DATEADD(yy,DATEDIFF(yy,0,getdate()),0)), 120)) as yue from master.dbo.spt_values WHERE
type='P' AND number <= datediff(MONTH, DATEADD(yy,DATEDIFF(yy,0,getdate()),0),
dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1,0)) ) + 1 AND number>0

select * from master.dbo.spt_values where type='p'

select number from master..spt_values with(nolock) where type='P'

 
 
 
 
 
 
 
 
 
 
 
 
 
 

学习使用master.dbo.spt_values表的更多相关文章

  1. 对日期 ,和 master.dbo.spt_values 表操作

    if object_id('tempdb..#xs') is not null drop table #xs; ), date datetime, sale float) insert into #x ...

  2. 利用Master库spt_values表 连续数字

    SELECT CONVERT ( ), dateadd(d, number, GETDATE()), ) AS every_time FROM master..spt_values n WHERE n ...

  3. master.dbo.spt_values

    ,@date)) /*day--------------------200911012009110220091103200911042009110520091106200911072009110820 ...

  4. 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解   建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schem ...

  5. 系统spt_values表--生成时间方便left join

     时间处理我给你提供一个思路   系统有个spt_values表,可以构造一整个月的日期,然后左连接你统计好的数据,用CTE表构造多次查询 spt_values的超级经典的应用 http://www. ...

  6. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  7. ABP框架源码学习之修改默认数据库表前缀或表名称

    ABP框架源码学习之修改默认数据库表前缀或表名称 1,源码 namespace Abp.Zero.EntityFramework { /// <summary> /// Extension ...

  8. SQL Server ->> 调用系统内建扩展存储过程"master.dbo.xp_delete_file"删除过期备份文件

    DECLARE @oldDate DATETIME SET @oldDate = GETDATE()-30 EXECUTE MASTER.dbo.xp_delete_file 0, N'D:\back ...

  9. ng2 学习笔记(二)表单及表单验证

    在上一篇文章中提到了表单,只说了表单的数据绑定,这一篇文章主要讲一下表单验证,为什么把表单单独拿出来学习,主要是因为,表单是商业应用的支柱,我们用它来执行登录.求助.下单.预订机票.安排会议,以及不计 ...

随机推荐

  1. Codeforces 626 C. Block Towers-二分 (8VC Venture Cup 2016-Elimination Round)

      C. Block Towers   time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. php中parse_url函数的源码及分析

    前言 看师傅们的文章时发现,parse_url出现的次数较多,单纯parse_url解析漏洞的考题也有很多,在此研究一下源码(太菜了看不懂,待日后再补充Orz) 源码 PHPAPI php_url * ...

  3. Android Studio查找功能(搜索功能)

    F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[find],开始在整个工程内查找该字符串   ...

  4. HDU 2503 (数论,最大公约数)

    a/b + c/d Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. Trie树&kmp&AC自动机&后缀数组&Manacher

    Trie 计数+Trie,读清题意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自动机 模板:https://vjudge.net/problem ...

  6. Largest Divisible Subset -- LeetCode

    Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...

  7. Spinner控件:Spinner绑定的监听是SetOnItemSelectedListener

    (一) 1.效果图:ArrayAdapter可以不用设置 arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_it ...

  8. Mongodb 学习笔记简介

    目录 1       准备工作... 5 1.1        相关网址... 6 1.1        下载安装... 6 1.1.1         下载:... 6 1.1.2         ...

  9. Jquery radio选中

    radio选中$("input[name=test][value=34]").attr("checked",true);//value=34的radio被选中$ ...

  10. jQuery用noConflict代替$

    js框架很多的情况下,很容易出现冲突,建议使用noConflict代替$ //消除$对jquery缩写 $.noConflict(); //使用了noConflict后,用$就会无效,应用jQuery ...