2015-10-13 69 views
-2

我已經看到了一些類似的問題,像這樣的東西出來了:如何在SQL中的(0-15000)之間生成不同的隨機100000數字作爲金錢類型?

select RAND(CHECKSUM(NEWID())) 

但問題是,當我把它換成錢的類型,它失去了一些數字,然後一些行會不會一樣了。

以下是我的整個代碼,請給我一些建議。

if(exists(select * from sysobjects where name='dump')) 
    drop table [dump] 

    --create the table 
    CREATE table [dump] 
    (id int ,name varchar(50), price money) 

    declare @p money=0 
    set @p= RAND(CHECKSUM(NEWID()))*15000 
    --set initial value 
    INSERT INTO dump 
    values(@i,newID(),@p) 
    --insert the rows 
    WHILE(@i<100000) 

    begin 
    set @p=RAND(CHECKSUM(NEWID()))*15000 
    set @i+=1 
     INSERT INTO dump 
     values(@i,newID(),@p) 
     print 'the nth row:'+cast(@i as varchar(15)) 
    end 
+2

請 –

+0

感謝您的評論的數據類型打交道時,對不起,總是標記您的DMBS,尤其是我不小心 –

+0

爲了澄清 - 你想生成並存儲10萬'unique'隨機數? –

回答

1

這將生成100K唯一值作爲一種貨幣類型。這在我的服務器上運行了20秒。

IF OBJECT_ID('tempdb..#dump') IS NOT NULL 
    DROP TABLE #dump 

CREATE TABLE #dump (Value MONEY) 
CREATE INDEX [IXDUMP] ON #dump(Value) 

DECLARE @i INT, @val MONEY 
SET @i=1 

WHILE @i <= 100000 /* SET THIS TO DESIRED COUNT */ 
BEGIN 
    SELECT @val=CONVERT(MONEY,RAND()*15000) 

    IF NOT EXISTS (SELECT 1 FROM #dump WHERE [email protected]) 
    BEGIN 
     INSERT INTO #dump(Value) 
     SELECT @val 

     SET @[email protected]+1 
    END 
    ELSE 
    BEGIN 
     PRINT '*' 
     /* DO NOTHING, GO AGAIN, WITH SAME @i VALUE */ 
    END 
END 

/* DUPE VALUE CHECK */ 
SELECT Value 
FROM #dump 
GROUP BY Value 
HAVING COUNT(2)>1 

/* COUNT CHECK */ 
SELECT COUNT(2) 
FROM #dump 
相關問題