需求是使用sqlserver根據指定的數字和表生成一串連續的數字,相似於oracle中ROWNUM的功能,具體實現以下:python
1、Oracle使用ROWNUM實現方式
1
2
3
4
SELECT
ROWNUM number_list
FROM 表名
WHERE ROWNUM <= 10;
sql
2、SqlServer實現上述功能的三種方式
1.使用MASTER…spt_values方式
數據庫
1
2
3
4
5
6
7
8
SELECT
number
FROM
MASTER..spt_values
WHERE
TYPE = 'P'
AND number > 0
AND number <= 10;
oracle
spt_values是master數據庫中的一張系統表,number的數值範圍是0~2047dom
2.使用String_Split函數實現ide
select row_number() over (order by (select 1)) from String_Split(space(6),' ')函數
String_Split是SQLServer 2016的新函數,這個方法只對2016及後續版本有效。sqlserver
(個人數據庫版本是2008,此方式未驗證)測試
3.使用top+ROW_NUMBER () OVER方式實現spa
1
2
3
4
5
6
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()系統函數能夠生成0到1之間的小數,利用它能夠生成固定區間 [Min,Max] 的小數:Min + (Max - Min) * RAND(),另外CHECKSUM(NEWID())也能夠生成一串比較大的整數(9位或10位數居多),再配合ABS取絕對值和取模運算,就能夠很好的控制所生成隨機數的範圍了。
區間隨機數函數
爲了SQL寫起來方便,可事先建立一個自定義函數,用來生成區間隨機數:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
這裏先建立了一個視圖,而後在函數體內引用,是由於SQL Server不支持直接在函數體中引用RAND函數,會報錯Invalid use of a side-effecting operator ‘rand' within a function.。
列表選擇
若是是從少許的枚舉數值中選擇,可使用CHOOSE函數。
若從大量候選項中選擇,可將數據導入含自增列的數據庫表後,經過標量子查詢進行選擇。
造數SQL
1
2
3
4
5
6
SELECT TOP 5000
ABS(CHECKSUM(NEWID())) % 100 + 1 AS Col_A
,dbo.Random_Rangehttps://blog.51cto.com/14830013/2549657(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的功能畢竟有限,基本只適合從固定列表中隨機選擇,以及生成隨機數值性數據的場景;
若要造出更符合業務領域特性的數據,好比批量生成城市名、郵箱、人名、手機號、地址等數據,用純SQL就會有點吃力了,下一篇將介紹如何用python的faker庫生成測試數據。
以上這篇SqlServer生成連續數字根據指