系统表master..spt_values的用途是什么,其值的含义是什么?


70

系统表master..spt_values的目的是什么?
为什么提供它,以及应该如何使用它?

它的类型,低,高值的含义是什么?

更新:
Google搜索提供了成千上万的“用途”,例如:

Answers:


58

spt_values表未在SQL Server文档中提及,但它可以追溯到Sybase时代,并且Sybase联机文档中有一些极少的文档,可以在此注释中加以总结:

若要查看其用法,请执行sp_helptext并查看引用它的系统过程之一的文本。

换句话说,阅读代码并自己解决。

如果您四处查看系统存储过程并检查表数据本身,那么很显然,该表用于将代码转换为可读的字符串(除其他外)。或如上面链接的Sybase文档所述,“将内部系统值转换为可读格式”

该表有时用于MSDN博客中的代码段中,但从未用于正式文档中,通常用作数字列表的便捷来源。但是,正如在其他地方讨论的那样,创建自己的数字来源比使用未记录的系统表更安全,更可靠。甚至有一个Connect请求要求在SQL Server本身中提供一个“正确的”,已记录的编号表。

无论如何,该表是完全没有文档记录的,因此至少从实际的角度来看,对它的任何了解都没有太大价值:下一个servicepack或升级可能会完全改变它。理智的好奇心当然是另外一回事:-)


6
它被系统存储库大量使用,没有机会改变。
PerformanceDBA 2010年

4
@PerformanceDBA:您可能是对的(毕竟,该表从4.x或更早的版本一直存在到2008年),但这仍然不能保证Microsoft将来不会对其进行更改。依赖未公开记录的功能始终存在一些风险,即使它很小。
Pondlife,2010年

7
我没有拒绝你。我不同意一个说法。这不值得争论,因为您拒绝回答我的观点,即MS在其系统存储的proc中大量使用了它,因此删除将需要对其进行写入,这很可能像滚雪球一样在地狱中。阅读我的其他答案以获取更多详细信息。无法保证MS将来会存在;-)
PerformanceDBA 2010年

14
@PerformanceDBA:就像我说的那样,我认为您可能是对的,但是要解决您的特定问题:Microsoft已经修改了许多系统proc以使用新的DMV而不是旧的系统表,因此显然代码并不是一成不变的并且会随着版本的更改而积极维护。如果他们可以将对dbo.sysusers的引用替换为对sys.database_principals的引用,则他们当然可以将对spt_values的引用更改。当然,他们是否愿意纯粹是猜测(我不在Microsoft工作)。
Pondlife 2010年

1
@didierc已更新,因为原始链接现在已失效
Pondlife 2014年

5

大多在另一个问题中回答

它的类型,低,高值的含义是什么?

大多数类型(即每个特定的查找表,如果它们是分开的)都需要名称或编号。某些类型也需要低和高列。在Sybase中,我们有一个ErrorNumber列,因此该存储过程可以RAISERROR而不是硬编码的(可以随版本等进行更改)。

除非枚举列表对您“不明确”,否则它不是“不明确”的;它只是一个查找表(所有这些都由“类型”列来区分)。


2

一种用法(绝对不是其主要用法)是生成一系列数字:

--Generate a series from 1 to 100
SELECT
    TOP 100
    ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNum
FROM master.dbo.spt_values ORDER BY RowNum
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.