2014-06-22 25 views
0

我想在SQL SERVER2008中生成100000個不重複的隨機數。如何在SQL SERVER2008中生成100000個不重複的隨機數

這些數字必須像1和100000之間以下:

RandNumber 

    100 
    9 
    1000 
    34 
    67 
    546 
    64000 
+1

http://stackoverflow.com/questions/19875588/generate-random-numbers-using-sql –

+1

如果你想1 100000在10萬個的數字沒有重複只有一個組數字無論如何都適合!你問如何隨機訂購這些東西? –

+1

它怎麼可能是一個沒有「不重複」約束的問題的重複?隨機訂購數字1..100000與挑選1000000個隨機數字不同,後者可能相同。請注意這個問題本身,而不僅僅是標題。 – user2864740

回答

5

既然沒有意義的記錄在SQL表中的順序,你所要做的就是創建連續的整數表

--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) 

從該表可以按隨機順序使用這樣的查詢,然後選擇號碼:

從1到100000 說,類似的東西值
-- Select values in a random order 
SELECT IntValue 
FROM NumbersTable 
ORDER BY NEWID() 

NEWID()函數生成一個uniqueIdentifier(GUID)。由於guid是以隨機順序創建的,因此可以使用它來隨機對查詢輸出進行排序。

+0

'INSERT INTO dbo.Test(ID)SELECT IntValue FROM NumbersTable ORDER BY NEWID()'not random order – user3757263

+0

@ user3757263因爲從關係透視表中的行是無序的。因此,SQL Server 2012+只是在這裏優化了'ORDER BY'[並忽略它](http://stackoverflow.com/questions/11222043/table-valued-function-order-by-is-ignored-in-output/ 11231935#11231935)。 –

+0

我開始我的答案**因爲沒有意義的記錄在SQL表**的順序**。正如馬丁史密斯所說的那樣,當將記錄插入表格時不能對記錄進行排序。 –

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

1

我想,而不是使用while循環中,下面的方法會更好:

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 

只需在上面的查詢用一個簡單的數學。

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 
相關問題