我们的常驻数据库专家告诉我们,数字表非常宝贵。我不太明白为什么。这是一个数字表:
USE Model
GO
CREATE TABLE Numbers
(
Number INT NOT NULL,
CONSTRAINT PK_Numbers
PRIMARY KEY CLUSTERED (Number)
WITH FILLFACTOR = 100
)
INSERT INTO Numbers
SELECT
(a.Number * 256) + b.Number AS Number
FROM
(
SELECT number
FROM master..spt_values
WHERE
type = 'P'
AND number <= 255
) a (Number),
(
SELECT number
FROM master..spt_values
WHERE
type = 'P'
AND number <= 255
) b (Number)
GO
Run Code Online (Sandbox Code Playgroud)
根据博客文章,给出的理由是
数字表真的是无价之宝。我一直使用它们来进行字符串操作、模拟窗口函数、用大量数据填充测试表、消除游标逻辑以及许多其他没有它们将非常困难的任务。
但我不明白这些用途到底是什么——你能提供一些引人注目的具体例子,说明“数字表”在 SQL Server 中为你节省了大量工作——以及为什么我们应该拥有它们?
假设不使用 ORDER BY 子句,在实例化表并用连续插入填充表的 TABLE 值函数中,插入顺序是否具有确定性?
我需要查看发送给我们的给定数据集中使用的 Unicode 字符范围,以便弄清楚为什么 SSMS 中的查询结果中的某些空格(或者至少在眼睛看来是空格)没有被使用。在某些解析例程中,其行为类似于 char(32)。因此,我编写了一个快速而肮脏的函数,将相关列中的字符串值转换为一组可以查询的元组:
create function [foo].[AllChars]
(@in nvarchar(max))
returns @t TABLE (c nchar(1))
as
begin
declare @i int;
while len(@in)>0
begin
insert @t(c) values (left(@in,1));
set @in = substring(@in, 2, len(@in)-1)
end
return;
end
Run Code Online (Sandbox Code Playgroud)
可以这样称呼:
select X.c theChar, unicode(X.c) uValue
from myTable T
cross apply foo.AllChars(T.myCol) X
Run Code Online (Sandbox Code Playgroud)
并将为myTable中的每一行返回一组元组:
t 116
h 104
e 101
32
c 99
a 97
t 116
10 <= culprit
i 105
n 110
32 …
Run Code Online (Sandbox Code Playgroud) sql-server determinism t-sql set-returning-functions non-deterministic