SqlServer生成連續(xù)數字根據指定的數字操作
需求是使用sqlserver根據指定的數字和表生成一串連續(xù)的數字,類似于oracle中ROWNUM的功能,具體實現如下:
一、Oracle使用ROWNUM實現方式
SELECT ROWNUM number_list FROM 表名 WHERE ROWNUM <= 10;
二、SqlServer實現上述功能的三種方式
1.使用MASTER…spt_values方式
SELECT number FROM MASTER..spt_values WHERE TYPE = 'P' AND number > 0 AND number <= 10;
spt_values是master數據庫中的一張系統(tǒng)表,number的數值范圍是0~2047
2.使用String_Split函數實現
select row_number() over (order by (select 1)) from String_Split(space(6),' ')
String_Split是SQLServer 2016的新函數,這個方法只對2016及后續(xù)版本有效。
(我的數據庫版本是2008,此方式未驗證)
3.使用top+ROW_NUMBER () OVER方式實現
SELECT TOP 10 ROW_NUMBER () OVER ( ORDER BY (SELECT 1)) number_list FROM (SELECT TOP 10 * FROM 表名) t;
第一種方式對數據庫版本無要求,但是取值范圍有限制0~2047;
第二種方式對數據庫版本有要求,要在2016及之上;
第三種方式對數據庫版本無要求,只要表里的數據量大于要生成的數字即可;
補充知識:數據庫生成測試數據(SQL實現)
需求
項目中偶爾會有造數據進行測試的情況,根據常見的數據特征,我這里假設數據某表Table_X含4個字段,每個字段的要求如下,需要造出5000條數據。
以上需求看上去非常簡單,但比較具有代表性,復雜需求也是由小需求排列組合而成。
功能準備
隨機數
造數的核心功能是生成隨機數,SQL Server下有RAND()系統(tǒng)函數可以生成0到1之間的小數,利用它可以生成固定區(qū)間 [Min,Max] 的小數:Min + (Max - Min) * RAND(),另外CHECKSUM(NEWID())也可以生成一串比較大的整數(9位或10位數居多),再配合ABS取絕對值和取模運算,就可以很好的控制所生成隨機數的范圍了。
區(qū)間隨機數函數
為了SQL寫起來方便,可事先創(chuàng)建一個自定義函數,用來生成區(qū)間隨機數:
CREATE VIEW vwRand AS SELECT RAND() AS RandValue GO CREATE FUNCTION dbo.Random_Range ( @Min DECIMAL(22,5) ,@Max DECIMAL(22,5) )RETURNS DECIMAL(22,5) -- return value between @Min and @Max BEGIN DECLARE @Result DECIMAL(22,5); SELECT @Result = @Min + (@Max - @Min) * RandValue FROM vwRand; RETURN @Result END GO
這里先創(chuàng)建了一個視圖,然后在函數體內引用,是因為SQL Server不支持直接在函數體中引用RAND函數,會報錯Invalid use of a side-effecting operator ‘rand' within a function.。
列表選擇
如果是從少量的枚舉數值中選擇,可以使用CHOOSE函數。
若從大量候選項中選擇,可將數據導入含自增列的數據庫表后,通過標量子查詢進行選擇。
造數SQL
SELECT TOP 5000 ABS(CHECKSUM(NEWID())) % 100 + 1 AS Col_A ,dbo.Random_Range(5000, 10000) AS Col_B ,ISNULL(CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'S', 'M', 'L', 'XL', 'XXL'), 'M') AS Col_C ,DATEADD(DAY, dbo.Random_Range(0, DATEDIFF(DAY, '20000101', '20201231')), '20000101') AS Col_D FROM sys.all_columns
說明
實際需求可能字段非常多,但基本都可以用以上寫法,修改參數即可;
SQL的功能畢竟有限,基本只適合從固定列表中隨機選擇,以及生成隨機數值性數據的場景;
若要造出更符合業(yè)務領域特性的數據,比如批量生成城市名、郵箱、人名、手機號、地址等數據,用純SQL就會有點吃力了,下一篇將介紹如何用python的faker庫生成測試數據。
以上這篇SqlServer生成連續(xù)數字根據指定的數字操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SQL Server誤區(qū)30日談 第22天 資源調控器可以調控IO
資源調控器無法調控IO,希望下一個版本的SQL Server支持調控IO,調控IO對于對于減少對于大表的scan操作帶來的性能影響很有幫助2013-01-01sp_executesql 使用復雜的Unicode 表達式錯誤的解決方法
sp_executesql 使用復雜的Unicode 表達式錯誤的解決方法,需要的朋友可以參考下2012-01-01SQL?Server數據庫創(chuàng)建表及其約束條件的操作方法
這篇文章主要介紹了SQL?Server?創(chuàng)建表及其約束條件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11SqlServer使用公用表表達式(CTE)實現無限級樹形構建
本文給大家分享的是sqlserver中使用公用表表達式(CTE)實現無限級樹形構建的詳細代碼,非常的簡單實用,有需要的小伙伴可以參考下2017-08-08