学习使用master.dbo.spt_values表

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

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<[email protected]

上面的语句中,@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‘

原文地址:https://www.cnblogs.com/cjm123/p/8295844.html

时间: 2024-10-15 23:31:29

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

master.dbo.spt_values

--统计某月份周情况 没有的补0if object_id('temp_tb') is not null drop table temp_tb create table temp_tb([ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,[test_values] int NULL,[time] datetime null,);go insert into temp_tb([test_values],[time]) select 3,'2009-2-1 10:

对象名master.dbo.spt_values无效解决办法

找到sql server安装目录下的u_tables.sql,例如:E:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Install 在出现 对象名master.dbo.spt_values无效解决办法错误的执行一下脚本就可以修复 原文地址:https://www.cnblogs.com/yy981420974/p/8297422.html

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

HTML5学习笔记(二)——表单1

表单一直是网页必不可少的一部分,一直以来,表单的作用被无限扩展,发展出了诸多新奇的用法,老版的HTML只支持很少的一部分常用表单,许多的新表单都需要借助CSS与JavaScript语言来进行构建,现在HTML5来了,她带来了新的表单,这些强大的表单项,可以省去一大块复杂的JavaScript代码,很值得去学习. 而且在新的表单里面,不再像以前每个表单都必须位于<form></form>之内,只要在<form></form>内定义一个id,然后在网页任何位置都

MySQL学习笔记-数据类型与操作数据表

MySQL学习笔记-数据类型与操作数据表 数据类型:  1.字符型  2.整型  3.浮点型  4.日期时间型 数据表操作:  1.插入记录  2.查找记录 记录操作:  1.创建数据表  2.约束的使用 1.数据类型 [1]整型: 数据类型 存储范围 字节 TINYINT 有符号型:-128~127(-2^7~2^7 -1),无符号型0~255(0~2^8 -1) 1 SMALLINT 有符号型:-2^15~2^15 -1,无符号型0~2^16 -1 2 MEDIUMINT 有符号型:-2^2

Bootstrap快速学习笔记(2)表单系列之二

欢迎收看大奥编写的Bootstrap快速学习笔记(2)表单系列之二 本学习笔记根据[慕课网]教程修改而来,用它学习Bootstrap,将会带来全新的体验哦: 表单控件大小 表单控件状态 按钮 图像 详细介绍 表单控件大小表单控件大小可以通过给表单控件添加class类来实现,如果想要比较大,则添加input-lg类,如果想要比较小, 则添加input-sm类,但这仅是对高度进行了处理,如果要对宽度进行处理,需要在每个input控件外围添加div容器并带有col-xs-4类,并 且要在这组控件的外围

学习日记之JS验证表单

今天学习了JS的验证表单功能. 现在想想就有点小激动,也可以做出点小效果出来了. 需求:用户输入的密码中不能包含空格 表单代码: 密码 <input type="password" name="password"  onblur="checkPassword()"/><span id="passwordspan"></span> Js代码: function checkPassword(){

Entity Framework 6.x 学习之 - 创建带连接表的实体模型 with Database First

1. 创建数据库表 CREATE TABLE [Album] ( [AlbumId] [int] NOT NULL IDENTITY(1, 1), [AlbumName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ) ON [PRIMARY] GO ALTER TABLE [Album] ADD CONSTRAINT [PK_Album] PRIMARY KEY CLUSTERED ([AlbumId]) ON [PRIMARY] GO

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

疯狂的暑假学习之  Django学习笔记(五)-- 表单 参考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path                                 除域名以外的请求路径,斜杠开头                      "/hello/" request.get_host()                      主机名