- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对问题"Split one column into multiple rows"的答案提出质疑,我在这里将其重写为[1]。Type = 'P'
的含义是什么?为什么使用未公开的master..spt_values拆分列?它有什么好处?
[1]
CREATE TABLE dbo.Table1
(
Col1 CHAR(1),
Col2 CHAR(1),
Col3 CHAR(1),
Col4 VARCHAR(50)
)
GO
INSERT INTO dbo.Table1 VALUES ('A','B','C','1,2,3')
GO
INSERT INTO dbo.Table1 VALUES ('D','E','F','6,7,8,9')
GO
SELECT
T.col1, RIGHT(LEFT(T.col4,Number-1),
CHARINDEX(',',REVERSE(LEFT(','+T.col4,Number-1))))
FROM
master..spt_values,
table1 T
WHERE
Type = 'P' AND Number BETWEEN 1 AND LEN(T.col4)+1 AND
(SUBSTRING(T.col4,Number,1) = ','
-- OR SUBSTRING(T.col4,Number,1) = '') --this does not work correctly anyway
最佳答案
目的
为什么使用未记录的master..spt-values
Sybase及其产品的杂种MS SQL为产品提供了各种功能,这些功能是在系统过程中实现的(与像sqlserver这样的二进制文件一样,它们是作为服务启动的)。这些系统过程过程用SQL代码编写,并命名为sp_%.
除了一些秘密内部知识外,它们与任何其他SQL代码一样具有相同的限制和需求。它们是Sybase ASE或SQL Server产品的一部分。因此,他们不需要记录下来;并且内部位不能合理地标记为“未记录”。master..spt_values
在SQL表中包含所述系统过程所需的所有各种位和片段,以产生各种报告。 sp
表示系统过程; spt
表示系统过程表;当然values
是内容。
查找表
Type ='P'的含义是什么
人们通常将spt_values
描述为“去规范化”,但这是不正确的术语。正确的术语是折叠或包装。它是26个左右的逻辑查找表,每个逻辑查找表都经过漂亮的标准化,折叠成一个物理表,并带有Type
列以区分逻辑表。
现在在普通数据库中,那将是一个严重错误(只需查看“一个或多个查询表”的答案)。但是在服务器目录中,最好替换26个物理表。
“ L”代表LockType查找。 “ V”代表DeviceType查找(V是整个服务器中Device的缩写);类型“ P2”包含按位顺序,用于扩展打包到INT中的位。
为了执行投影,需要一组在已知范围内的连续数字(以SQL表的形式可用),许多系统过程必须这样做。类型“ P”是一个介于0到2047之间的连续数字的列表。
术语“投影”在这里用作技术上的精确含义,即自然的逻辑含义,而不是不自然的关系代数含义。
因此,spt_values,
仅有一个用途,即包含26个折叠的(否则是分开的)参考表和一个Projection表。
扩张
这样,spt_values
的普通用法就是作为普通的Lookup或Reference或ENUM
表。首先,查找值:
SELECT * -- list Genders
FROM Gender
SELECT P.*, -- list Person
G.Name -- expand GenderCode to Name
FROM Person P
JOIN Gender G
ON P.GenderCode = G.GenderCode
sp_lock
生成活动锁报告,将锁类型显示为字符串名称。但是
master..syslocks
包含数字形式的锁定类型,但不包含这些名称。如果这样做的话,那将是一个严重的非规范化表!如果执行查询(Sybase ASE代码,则必须进行转换):
SELECT * -- list LockTypes
FROM master..spt_values
WHERE type = "L"
sp_lock
执行简单的代码,例如上述的Person :: Gender:
SELECT spid, -- list Active Locks
DB_NAME(dbid),
OBJECT_NAME(id, dbid),
v.name, -- expand lock name
page,
row
FROM master..syslocks L,
master..spt_values LT
WHERE L.type = LT.number --
AND type = "L" -- LockType Lookup table
ORDER by 1, 2, 3, 4, 5, 6 -- such that perusal is easy
WHILE
循环。我们可以通过活动锁的计数来投影LockType查找表:
SELECT LT.name, -- list LockTypes
[Count] = ( -- with count
SELECT COUNT(*)
FROM master..syslocks
WHERE type = LT.number
)
FROM master..spt_values LT
WHERE type = "L"
spt_values
通常用于扩展或投影。现在您知道它在那里,您也可以使用它。它是安全的(在
master
数据库中),几乎由所有系统过程使用,这意味着没有它,系统过程将无法运行。
spt_values
,然后再次检查该代码。它只需要一个连续数字列表,以便可以逐字节浏览CSV列中的值列表。仅对每个逗号或字符串结尾的字节激活该代码。
master..spt_values
当然。如果您知道它在那里。
spt_values P
为该复杂代码提供了一个向量,使其更容易。
spt_values
,而不是每次都创建自己的临时表(或创建自己的私有永久表并对其进行维护)。
关于sql - 为什么(以及如何)使用master..spt_values拆分列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4273978/
在我的测试 SQL Server 2014 安装中,我正在“清理”master 数据库。 使用以下命令,我检查了哪些用户对象: SELECT 'DROP ' + CASE WH
我已经设置了正确的 SQL Server 版本并添加了 master 数据库作为数据库引用。 在添加引用之前和之后,master 数据库有几个 Unresolved 引用,所有这些引用都消失了。 只有
我是一名优秀的程序员,十分优秀!