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

Posted

技术标签:

【中文标题】系统表 master..spt_values 的用途是啥,其值的含义是啥?【英文标题】:What is the purpose of system table master..spt_values and what are the meanings of its values?系统表 master..spt_values 的用途是什么,其值的含义是什么? 【发布时间】:2011-05-15 11:53:15 【问题描述】:

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

它的类型,低值,高值是什么意思?

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

to split column using master..spt_values it contains numbers from 0 to 2047. It is very useful.for example if you need to populate a table with 100 numbers from this range for building indexes creating virtual calendars 以某种不直观和复杂的方式获取使用对象的描述Enumerate all the indexes in a SQL Server database (Giuseppe Dimauro, devx.com) "SQL Server 2005 script to display disk space usage"

"It's not worth talking about. This table is a design nightmare of a "super" lookup table"

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

Using OFFSET N ROWS FETCH NEXT N ROWS ONLY In SQL Server Denali for easy paging

【问题讨论】:

【参考方案1】:

一种用法,绝对不是它的主要用法,是生成一系列数字:

--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

【讨论】:

【参考方案2】:

spt_values 表在 SQL Server 文档中没有提及,但它可以追溯到 Sybase 时代,并且 Sybase 在线文档中有一些 extremely minimal documentation 可以总结在此评论中:

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

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

如果您浏览系统存储过程并检查表数据本身,很明显该表用于将代码转换为可读字符串(以及其他内容)。或者正如上面链接的 Sybase 文档所说,“将内部系统值 [...] 转换为人类可读的格式”

该表在 MSDN 博客的代码 sn-ps 中也是 sometimes used - 但从未出现在正式文档中 - 通常作为数字列表的方便来源。但正如elsewhere 所讨论的,创建自己的数字源是比使用未记录的系统表更安全、更可靠的解决方案。甚至还有 a Connect request 在 SQL Server 本身中提供一个“正确的”、记录在案的数字表。

无论如何,该表完全没有文档记录,因此至少从实际的角度来看,了解它没有任何意义:下一个服务包或升级可能会完全改变它。当然,求知欲是另一回事:-)

【讨论】:

它被系统存储程序大量使用,没有机会改变它。 @PerformanceDBA:您可能是对的(毕竟,该表可能从 4.x 或更早版本一直到 2008 年一直存在),但这仍然不能保证 Microsoft 会赢。将来不要改变它。依赖未记录的特性总是有一些风险,即使它很小。 我没有投票给你。我不同意一种说法。这不值得争论,因为您拒绝解决我的观点,即 MS 在他们的系统存储过程中大量使用它,因此删除将需要编写那些,这就像滚雪球一样地狱的机会。阅读我的另一个答案以获取更多详细信息。不能保证 MS 将来会存在 ;-) @PerformanceDBA:正如我所说,我认为您可能是对的,但为了解决您的具体问题:Microsoft 已经修改了许多系统过程以使用新的 DMV 而不是旧的系统表,所以显然代码不是一成不变的,并且随着版本的变化而积极维护。如果他们可以将 dbo.sysusers 的引用替换为对 sys.database_principals 的引用,那么他们当然可以更改对 spt_values 的引用。当然,他们是否会这样做纯属猜测(我不为微软工作)。 下一个服务包并没有改变任何东西。在接下来的 10 年内也没有任何其他更新,哈哈【参考方案3】:

大部分回复在another question

它的类型、低、高值是什么意思?

大多数类型(即每个特定的查找表,如果它们是单独的)需要名称或编号。某些类型也需要 Low 和 High 列。在 Sybase 中,我们有一个 ErrorNumber 列,因此 sproc 可以 RAISERROR 非硬编码(可以随版本等而变化)。

除非枚举列表对您来说是“神秘的”,否则它不是“神秘的”;它只是一个查找表(所有这些,由 Type 列区分)。

【讨论】:

以上是关于系统表 master..spt_values 的用途是啥,其值的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中master..spt_values的应用

sql server 生成连续日期

SQL点点滴滴_聪明的小写法(持续更新中)

SqlServer生成连续数字根据指定的数字操作

row_number 和 cte 使用实例:考场监考安排

外部表的用例?