如何在SQL SERVER 2008中生成100000无重复随机数

时间:2014-06-22 06:20:28

标签: sql-server sql-server-2008

我想在SQL SERVER 2008中生成100000个无重复的随机数。

这些数字必须介于1到100000之间。如下所示:

RandNumber

   100
   9
   1000
   34
   67
   546
   64000

4 个答案:

答案 0 :(得分:4)

由于sql表中记录的顺序没有意义,所以您只需要创建一个具有1到100000的连续整数值的表。 说,像这样:

--Create the table and populate it
SELECT TOP 100000 IDENTITY(int,1,1) AS IntValue 
INTO NumbersTable 
FROM sys.objects s1     
CROSS JOIN sys.objects s2 

-- Set the IntValue column as the primary key and clustered index
ALTER TABLE NumbersTable ADD CONSTRAINT PK_NumbersTable PRIMARY KEY CLUSTERED (IntValue)

然后,您可以使用以下查询以随机顺序选择数字:

-- Select values in a random order
SELECT IntValue
FROM NumbersTable 
ORDER BY NEWID()

NEWID()函数生成uniqueIdentifier(GUID)。由于guid是以随机顺序创建的,因此您可以使用它来随机对查询输出进行排序。

答案 1 :(得分:1)

您可以使用递归CTE生成数字。

CREATE TABLE [Numbers]
  (
     [Number] INT,
     CONSTRAINT [PK_Numbers] PRIMARY KEY ([Number])
  );

WITH [cteNumbers]
     AS (SELECT 1 AS [Number]
         UNION ALL
         SELECT [cteNumbers].[Number] + 1
         FROM   [cteNumbers]
         WHERE  [cteNumbers].[Number] < 100000)
INSERT INTO [Numbers]
            ([Number])
SELECT [cteNumbers].[Number]
FROM   [cteNumbers]
OPTION (MAXRECURSION 0);

请注意,使用递归CTE并不需要将数字存储在表中以使用它们,您只需在需要的地方使用递归CTE定义。

请记住加入OPTION (MAXRECURSION 0)

如果您想以随机顺序使用这些数字,order them randomly

答案 2 :(得分:1)

我认为不是使用WHILE LOOP,而是使用以下方法:

DECLARE @TempTable TABLE( Numbers INT)

;WITH CTE AS
(
    SELECT 0 Units UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
    SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 
)
INSERT INTO @TempTable( Numbers)
SELECT Unit.Units + Hundred.Units * 10 + Thousand.Units * 100 
       + Lakh.Units * 1000 + TenLakhs.Units * 10000 + 1 Numbers
FROM CTE Unit,
CTE Hundred,
CTE Thousand,
CTE Lakh,
CTE TenLakhs


SELECT *
FROM @TempTable

只是上述查询中使用的简单数学。

答案 3 :(得分:0)

CREATE TABLE Numbers (id bigint IDENTITY(1,1) NOT NULL)
INSERT Numbers DEFAULT VALUES
GO 100000
SELECT id FROM Numbers ORDER BY NewID()
GO