系统表master..spt_values的目的是什么,它的值有什么含义?

82

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

其类型、low值和high值的含义是什么?

更新:
谷歌搜索会给出数千个“它的用途”,例如:

有些帖子警告不要使用它,因为它可能会在未来版本的SQL Server中被删除,但已经有了使用它来说明新SQL Server 11(Denali)新功能的代码脚本:

3个回答

71
spt_values表在SQL Server文档中没有提及,但它可以追溯到Sybase时代,并且Sybase在线文档中有一些极少量的文档, 可以归纳为以下评论:

要查看如何使用它,请执行sp_helptext并查看引用它的系统过程的文本。

换句话说,阅读代码并自行解决问题。
如果您浏览系统存储过程并检查表数据本身,则很清楚该表用于将代码转换为可读字符串(以及其他内容)。或者如上面链接的Sybase文档所述,“将内部系统值[...]转换为人类可读格式”。
该表也有时在MSDN博客的代码片段中使用-但从未在正式文档中使用-通常作为方便的数字列表来源。但是正如其他地方讨论的那样,创建自己的数字源比使用未记录的系统表更安全、更可靠。甚至有一个Connect请求来提供在SQL Server本身中提供“正确”的、经过记录的数字表。

无论如何,这个表格完全没有文档,因此从实际的角度来看,了解它的任何信息都没有太大的价值:下一个服务包或升级可能会完全改变它。当然,知识好奇心另当别论 :-)


7
它被系统存储过程广泛使用,没有改变的机会。 - PerformanceDBA
5
@PerformanceDBA:您可能是正确的(毕竟,该表格很可能从4.x版本或更早版本一直持续到2008年),但这仍然不能保证微软不会在未来进行更改。依赖未记录的功能始终存在一定风险,即使是小风险。 - Pondlife
9
我没有给你投反对票。我只是对一个陈述表示不同意。这并不值得争论,因为你拒绝回应我的观点,即该陈述在MS的系统存储过程中被大量使用。因此,删除该陈述将需要重写这些存储过程,而这几乎不可能。请阅读我其他答案以获取更多详细信息。不能保证微软公司将来会存在;) - PerformanceDBA
15
@PerformanceDBA: 我认为你说得对,但是针对你具体提到的一点:微软已经修改了许多系统存储过程,使用新的 DMV 代替旧的系统表,因此很明显代码不是铁板一块,而是在随版本变化而积极维护。如果他们可以用 sys.database_principals 替换对 dbo.sysusers 的引用,那么他们肯定也可以改变对 spt_values 的引用。当然,无论是否这样做都只是纯粹的推测(我不是微软的员工)。 - Pondlife
1
@didierc 更新了,因为原始链接现在已经失效。 - Pondlife
2
下一个服务包顺便说一句,并没有改变任何东西。接下来的10年里也没有任何其他更新,哈哈。 - KappaG3

7

这个问题大部分在另一个问题中得到了解答。

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

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

这并不“神秘”,除非你认为列举清单是“神秘”的;它只是一个查找表(所有这些表都由 Type 列区分开来)。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接