我想在SQL SERVER 2008中生成100000个无重复的随机数。
这些数字必须介于1到100000之间。如下所示:
RandNumber
100
9
1000
34
67
546
64000
答案 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