1. 程式人生 > 資料庫 >SqlServer生成連續數字根據指定的數字操作

SqlServer生成連續數字根據指定的數字操作

需求是使用sqlserver根據指定的數字和表生成一串連續的數字,類似於oracle中ROWNUM的功能,具體實現如下:

一、Oracle使用ROWNUM實現方式

SELECT 
 ROWNUM number_list
FROM 表名
WHERE ROWNUM <= 10;

SqlServer生成連續數字根據指定的數字操作

二、SqlServer實現上述功能的三種方式

1.使用MASTER…spt_values方式

SELECT
 number 
FROM
 MASTER..spt_values 
WHERE
 TYPE = 'P' 
 AND number > 0 
 AND number <= 10;

SqlServer生成連續數字根據指定的數字操作

spt_values是master資料庫中的一張系統表,number的數值範圍是0~2047

2.使用String_Split函式實現

select row_number() over (order by (select 1)) from String_Split(space(6),' ')

String_Split是SQLServer 2016的新函式,這個方法只對2016及後續版本有效。

(我的資料庫版本是2008,此方式未驗證)

3.使用top+ROW_NUMBER () OVER方式實現

SELECT TOP
 10 ROW_NUMBER () OVER (
ORDER BY
 (SELECT 1)) number_list 
FROM
(SELECT TOP 10 * FROM 表名) t;

SqlServer生成連續數字根據指定的數字操作

第一種方式對資料庫版本無要求,但是取值範圍有限制0~2047;

第二種方式對資料庫版本有要求,要在2016及之上;

第三種方式對資料庫版本無要求,只要表裡的資料量大於要生成的數字即可;

補充知識:資料庫生成測試資料(SQL實現)

需求

專案中偶爾會有造資料進行測試的情況,根據常見的資料特徵,我這裡假設資料某表Table_X含4個欄位,每個欄位的要求如下,需要造出5000條資料。

SqlServer生成連續數字根據指定的數字操作

以上需求看上去非常簡單,但比較具有代表性,複雜需求也是由小需求排列組合而成。

功能準備

隨機數

造數的核心功能是生成隨機數,SQL Server下有RAND()系統函式可以生成0到1之間的小數,利用它可以生成固定區間 [Min,Max] 的小數:Min + (Max - Min) * RAND(),另外CHECKSUM(NEWID())也可以生成一串比較大的整數(9位或10位數居多),再配合ABS取絕對值和取模運算,就可以很好的控制所生成隨機數的範圍了。

區間隨機數函式

為了SQL寫起來方便,可事先建立一個自定義函式,用來生成區間隨機數:

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

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的功能畢竟有限,基本只適合從固定列表中隨機選擇,以及生成隨機數值性資料的場景;

若要造出更符合業務領域特性的資料,比如批量生成城市名、郵箱、人名、手機號、地址等資料,用純SQL就會有點吃力了,下一篇將介紹如何用python的faker庫生成測試資料。

以上這篇SqlServer生成連續數字根據指定的數字操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。