相关疑难解决方法(0)

为什么数字表“无价”?

我们的常驻数据库专家告诉我们,数字表非常宝贵。我不太明白为什么。这是一个数字表:

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 中为你节省了大量工作——以及为什么我们应该拥有它们?

sql-server

116
推荐指数
4
解决办法
2万
查看次数

表值函数对于插入顺序是否具有确定性?

假设不使用 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

4
推荐指数
1
解决办法
712
查看次数