SQL Server数字辅助表的实现
IF OBJECT_ID(N'dbo.Nums', 'U') IS NOT NULL
BEGIN
DROP TABLE dbo.Nums;
END
GO CREATE TABLE dbo.Nums
(
Num INT NOT NULL,
CONSTRAINT PK_U_CL_Nums_Num PRIMARY KEY CLUSTERED
(
Num ASC
)
);
GO INSERT INTO dbo.Nums (Num)
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
FROM master.dbo.spt_values;
GO
注意:如何填充物理数字表的方法很多,为了演示作用使用了一种。
SELECT Num
FROM dbo.Nums;
GO
执行后的查询结果如下:


IF OBJECT_ID(N'dbo.ufn_GetNums', N'IF') IS NOT NULL
BEGIN
DROP TABLE dbo.ufn_GetNums;
END
GO --==================================
-- 功能: 获取指定范围的数字数列
-- 说明: 交叉最后层级的CTE得到的数据行:在L级(从0开始计数)得到的行的总数为2^^L。
-- 例如:在5级就会得到4 596行。5级的CTE提供了超过40亿的行。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
--==================================
CREATE FUNCTION dbo.ufn_GetNums
(
@bintLow BIGINT,
@bintHigh BIGINT
) RETURNS TABLE
AS
RETURN
WITH
L0 AS (SELECT c FROM (VALUES(), ()) AS LO(c)),
L1 AS (SELECT AS c FROM L0 AS T CROSS JOIN L0 AS T2),
L2 AS (SELECT AS c FROM L1 AS T CROSS JOIN L1 AS T2),
L3 AS (SELECT AS c FROM L2 AS T CROSS JOIN L2 AS T2),
L4 AS (SELECT AS c FROM L3 AS T CROSS JOIN L3 AS T2),
L5 AS (SELECT AS c FROM L4 AS T CROSS JOIN L4 AS T2),
Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum FROM L5) SELECT TOP (@bintHigh - @bintLow + ) @bintLow + RowNum - AS Num
FROM Nums
ORDER BY RowNum ASC;
GO
SQL Server 2012增加了有关分页的新特性,相关的T-SQL代码如下:
IF OBJECT_ID(N'dbo.ufn_GetNums2', N'IF') IS NOT NULL
BEGIN
DROP TABLE dbo.ufn_GetNums2;
END
GO --==================================
-- 功能: 获取指定范围的数字数列
-- 说明: 交叉最后层级的CTE得到的数据行:在L级(从0开始计数)得到的行的总数为2^^L。
-- 例如:在5级就会得到4 596行。5级的CTE提供了超过40亿的行。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
--==================================
CREATE FUNCTION dbo.ufn_GetNums2
(
@bintLow BIGINT,
@bintHigh BIGINT
) RETURNS TABLE
AS
RETURN
WITH
L0 AS (SELECT c FROM (VALUES(), ()) AS LO(c)),
L1 AS (SELECT AS c FROM L0 AS T CROSS JOIN L0 AS T2),
L2 AS (SELECT AS c FROM L1 AS T CROSS JOIN L1 AS T2),
L3 AS (SELECT AS c FROM L2 AS T CROSS JOIN L2 AS T2),
L4 AS (SELECT AS c FROM L3 AS T CROSS JOIN L3 AS T2),
L5 AS (SELECT AS c FROM L4 AS T CROSS JOIN L4 AS T2),
Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum FROM L5) SELECT @bintLow + RowNum - AS Num
FROM Nums
ORDER BY RowNum ASC
OFFSET ROWS FETCH FIRST @bintHigh - @bintLow + ROWS ONLY;
GO
以函数ufn_GetNums为例,演示相关的效果。获取指定范围的数字序列的T-SQL代码如下:
SELECT Num
FROM dbo.ufn_GetNums(, );
GO
执行后的查询结果如下:


SQL Server数字辅助表的实现的更多相关文章
- SQL虚拟数字辅助表
虚拟数字辅助表是一个整数序列,可以用来完成多种不同的任务,如生成日期跟时间值序列,及分裂值列表.要用查询逻辑产生一个大的整数序列,可以使用交叉连接(cross join). 交叉联接(cross jo ...
- SQL Server 怎样生成序列号(虚拟数字辅助表)
</pre><pre name="code" class="sql">--生成一个"序列" 或者说生成一个" ...
- SQL Server数据库、表、数据类型基本概念
一.SQL Server的数据存储结构 SQL Server是一个数据库管理系统,需要以有效方式存储高容量数据.要更好地理解SQL Server处理数据的方式,就需要了解数据的存储结构. 1.文件类型 ...
- SQL server 数据库用户表名称
转自(http://blog.163.com/jlj_sk/blog/static/22579293200861422833924/) 取得SQL server 数据库中 所有用户表名称 select ...
- 使用Spark加载数据到SQL Server列存储表
原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...
- 在SQL SERVER中获取表中的第二条数据
在SQL SERVER中获取表中的第二条数据, 思路:先根据时间逆排序取出前2条数据作为一个临时表,再按顺时排序在临时表中取出第一条数据 sql语句如下: select top 1 * from(se ...
- 显示 Sql Server 中所有表或表中行的信息
在MSSQL中显示某个数据库中所有表或视图的信息: (以下语句为获取所有表信息,将绿色字"U"替换为"V"则获取所有视图信息.) SELECT sysobjec ...
- 快速查看SQL Server 中各表的数据量以及占用空间大小
快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
随机推荐
- VS2013 生成安装文件
在VS2012之前,我们做安装包一般都是使用VS自带的安装包制作工具来创建安装包的,VS2012.VS2013以后,微软把这个去掉,集成使用了InstallShield进行安装包的制作了,虽然思路差不 ...
- 自己实现一个Native方法的调用
JNI 开始本篇的内容之前,首先要讲一下JNI.Java很好,使用的人很多.应用极广,但是Java不是完美的.Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系 ...
- 团队项目——站立会议DAY14
第十四次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:修改页面,查漏补缺.进行需求分析,监督每个组员,把大家的问题都一一梳理. 2.钟灵毓秀:继续修改模块代码 ...
- [蓝牙] 4、Heart Rate Service module
Detailed Description Heart Rate Service module. This module implements the Heart Rate Service with t ...
- 用C表达面向对象语言的机制2——颠覆你对方法调用的看法!
用C表达面向对象语言的机制2——颠覆你对方法调用的看法! 源代码在文末.推荐阅读本文PDF版,格式更好看. 在上一篇<用C表达面向对象语言的机制——C#版>中,我们获知了如何用C表达面向对 ...
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- IIS中发布网站的问题
1.将网站发布到IIS,访问发生如下错误: HTTP 错误 500.21 - Internal Server Error处理程序"PageHandlerFactory-Integr" ...
- navigationController pop的几种方法
一,popViewControllerAnimated [self.navigationController popViewControllerAnimated:YES]; 二,popToRootVi ...
- MVVM架构~knockoutjs系列之验证成功提示显示
返回目录 对于knockout.validation来说,我们已经知道了如何去验证大部分表单元素,而有时,我们的需求希望在每个元素验证成功后,去显示正确的提示,这个我们很容易的使用self.元素.is ...
- EF架构~豁出去了,为了IOC,为了扩展,改变以前的IRepository接口
回到目录 使用了4年的IRepository数据仓储接口,今天要改变了,对于这个数据仓储操作接口,它提倡的是简洁,单纯,就是对数据上下文的操作,而直正的数据上下文本身我们却把它忽略了,在我的IRepo ...