SQL Server 實(shí)現(xiàn)數(shù)字輔助表實(shí)例代碼
數(shù)字輔助表是一個(gè)連續(xù)整數(shù)的數(shù)列,通常用來(lái)實(shí)現(xiàn)多種不同的查詢(xún)?nèi)蝿?wù)。大多分兩類(lèi):足夠大物理數(shù)字表和表函數(shù),前者可以稱(chēng)為靜態(tài)的,后者可以稱(chēng)為動(dòng)態(tài)且按需生產(chǎn)。
物理數(shù)字表
物理數(shù)字表通常存在一個(gè)物理表,表記錄相對(duì)足夠大,相關(guān)的T-SQL代碼如下:
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
注意:如何填充物理數(shù)字表的方法很多,為了演示作用使用了一種。
測(cè)試的T-SQL代碼如下:
1 SELECT Num 2 FROM dbo.Nums; 3 GO
執(zhí)行后的查詢(xún)結(jié)果如下:
表函數(shù)
表函數(shù)實(shí)現(xiàn)使用交叉連接和CTE,SQL Server 2005和以上版本的T-SQL代碼如下:
IF OBJECT_ID(N'dbo.ufn_GetNums', N'IF') IS NOT NULL BEGIN DROP TABLE dbo.ufn_GetNums; END GO --================================== -- 功能: 獲取指定范圍的數(shù)字?jǐn)?shù)列 -- 說(shuō)明: 交叉最后層級(jí)的CTE得到的數(shù)據(jù)行:在L級(jí)(從0開(kāi)始計(jì)數(shù))得到的行的總數(shù)為2^2^L。 -- 例如:在5級(jí)就會(huì)得到4 294 967 596行。5級(jí)的CTE提供了超過(guò)40億的行。 -- 作者: XXX -- 創(chuàng)建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 --================================== CREATE FUNCTION dbo.ufn_GetNums ( @bintLow BIGINT, @bintHigh BIGINT ) RETURNS TABLE AS RETURN WITH L0 AS (SELECT c FROM (VALUES(1), (1)) AS LO(c)), L1 AS (SELECT 1 AS c FROM L0 AS T CROSS JOIN L0 AS T2), L2 AS (SELECT 1 AS c FROM L1 AS T CROSS JOIN L1 AS T2), L3 AS (SELECT 1 AS c FROM L2 AS T CROSS JOIN L2 AS T2), L4 AS (SELECT 1 AS c FROM L3 AS T CROSS JOIN L3 AS T2), L5 AS (SELECT 1 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 + 1) @bintLow + RowNum - 1 AS Num FROM Nums ORDER BY RowNum ASC; GO
SQL Server 2012增加了有關(guān)分頁(yè)的新特性,相關(guān)的T-SQL代碼如下:
IF OBJECT_ID(N'dbo.ufn_GetNums2', N'IF') IS NOT NULL BEGIN DROP TABLE dbo.ufn_GetNums2; END GO --================================== -- 功能: 獲取指定范圍的數(shù)字?jǐn)?shù)列 -- 說(shuō)明: 交叉最后層級(jí)的CTE得到的數(shù)據(jù)行:在L級(jí)(從0開(kāi)始計(jì)數(shù))得到的行的總數(shù)為2^2^L。 -- 例如:在5級(jí)就會(huì)得到4 294 967 596行。5級(jí)的CTE提供了超過(guò)40億的行。 -- 作者: XXX -- 創(chuàng)建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 --================================== CREATE FUNCTION dbo.ufn_GetNums2 ( @bintLow BIGINT, @bintHigh BIGINT ) RETURNS TABLE AS RETURN WITH L0 AS (SELECT c FROM (VALUES(1), (1)) AS LO(c)), L1 AS (SELECT 1 AS c FROM L0 AS T CROSS JOIN L0 AS T2), L2 AS (SELECT 1 AS c FROM L1 AS T CROSS JOIN L1 AS T2), L3 AS (SELECT 1 AS c FROM L2 AS T CROSS JOIN L2 AS T2), L4 AS (SELECT 1 AS c FROM L3 AS T CROSS JOIN L3 AS T2), L5 AS (SELECT 1 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 - 1 AS Num FROM Nums ORDER BY RowNum ASC OFFSET 0 ROWS FETCH FIRST @bintHigh - @bintLow + 1 ROWS ONLY; GO
以函數(shù)ufn_GetNums為例,演示相關(guān)的效果。獲取指定范圍的數(shù)字序列的T-SQL代碼如下:
SELECT Num FROM dbo.ufn_GetNums(11, 20); GO
執(zhí)行后的查詢(xún)結(jié)果如下:
博友如有其他更好的解決方案,也請(qǐng)不吝賜教,萬(wàn)分感謝。
參考清單列表
1、《Microsoft SQL Server 2012 High-Performance T-SQL Using Window Functions》 作者 Itzik Ben-Gan(美國(guó))(SQL Server Inside 有關(guān)書(shū)籍的作者)
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- C#訪問(wèn)SQLServer增刪改查代碼實(shí)例
- SqlServer查詢(xún)和Kill進(jìn)程死鎖的語(yǔ)句
- SQLServer批量更新兩個(gè)關(guān)聯(lián)表數(shù)據(jù)的方法
- sqlserver進(jìn)程死鎖關(guān)閉的方法
- 獲取SqlServer存儲(chǔ)過(guò)程定義的三種方法
- SqlServer存儲(chǔ)過(guò)程實(shí)現(xiàn)及拼接sql的注意點(diǎn)
- win2008 r2 服務(wù)器php+mysql+sqlserver2008運(yùn)行環(huán)境配置(從安裝、優(yōu)化、安全等)
- SqlServer2008誤操作數(shù)據(jù)(delete或者update)后恢復(fù)數(shù)據(jù)的方法
- Windows2012配置SQLServer2014AlwaysOn的圖解
相關(guān)文章
SQLServer實(shí)現(xiàn)Ungroup操作的示例代碼
本文主要介紹了SQLServer實(shí)現(xiàn)Ungroup操作的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程分頁(yè)顯示
數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程分頁(yè)顯示...2006-08-08存儲(chǔ)過(guò)程實(shí)現(xiàn)(可帶查詢(xún)條件/萬(wàn)能分頁(yè)/通用)
可帶查詢(xún)條件的SQL語(yǔ)句的分頁(yè)存儲(chǔ)過(guò)程,在項(xiàng)目開(kāi)發(fā)中很實(shí)用,感興趣的朋友可以了解下,希望本文可以鞏固你的存儲(chǔ)過(guò)程的相關(guān)知識(shí)2013-01-01SQL2000個(gè)人版 應(yīng)用程序正常初始化失敗0乘以C0000135失敗
應(yīng)用程序正常初始化(0*c0000135)失敗。是什么意思?2011-01-01SQL中varchar和nvarchar的基本介紹及其區(qū)別
varchar長(zhǎng)度為 n 個(gè)字節(jié)的可變長(zhǎng)度且非 Unicode 的字符數(shù)據(jù),nvarchar包含 n 個(gè)字符的可變長(zhǎng)度 Unicode 字符數(shù)據(jù)2014-07-07SQLServer三種開(kāi)窗函數(shù)詳細(xì)用法
本文主要介紹了SQLServer三種開(kāi)窗函數(shù)詳細(xì)用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法
這篇文章主要介紹了SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法,涉及SQL Server的循環(huán)、遍歷、判定及插入等相關(guān)操作技巧,需要的朋友可以參考下2016-08-08sqlserver 函數(shù)、存儲(chǔ)過(guò)程、游標(biāo)與事務(wù)模板
SQL 函數(shù)、存儲(chǔ)過(guò)程、游標(biāo)與事務(wù)模板,學(xué)習(xí)sqlserver的朋友很多情況下都需要用得到。2010-08-08SQLServer高效解析JSON格式數(shù)據(jù)的實(shí)例過(guò)程
Sql Server從2016開(kāi)始支持了一些json操作,最近的項(xiàng)目里也是好多地方直接用字段直接存成了json,下面這篇文章主要給大家介紹了關(guān)于SQLServer高效解析JSON格式數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-08-08深入sql server 2005 萬(wàn)能分頁(yè)存儲(chǔ)過(guò)程的詳解
本篇文章是對(duì)sqlserver2005中的萬(wàn)能分頁(yè)存儲(chǔ)過(guò)程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06