2017-03-05 73 views
-3

對於MSSQL 2014,我需要幫助將500萬個隨機行添加到表中,其中varchar(25)pk列,第二個BIGINT &第三個nvarchar(256)。我如何編寫腳本?向表中添加唯一的隨機500萬行

[所以,我想到了首先將值填充到主鍵列和BIGINT列中。我每次運行該腳本,我得到的算術溢出錯誤數據類型轉換期間]

Create table Alok(Col1 varchar(25) NOT NULL PRIMARY KEY, Col2 BIGINT NOT NULL, Col3 nvarchar(256)) 
--At first, just trying to insert values for PKColumn and BIGINT Column as couldn't script for all three columns at once. 
DECLARE @RowCount INT 
DECLARE @RowString VARCHAR(25) 
DECLARE @Random INT 
DECLARE @Upper INT 
DECLARE @Lower INT 
DECLARE @InsertCol2 BIGINT 

--To configure the items that are set once per run. 
SET @Lower = 0 
SET @Upper = 9223372036854775807 
SET @RowCount = 0 
--Setting up the RowCount 
WHILE @RowCount < 5000000 
BEGIN 
SET @RowString = CAST(@RowCount AS VARCHAR(25)) 

SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) 

SET @InsertCol2 = ROUND(((@Lower + 9000000000) * RAND()), 15) 

INSERT INTO Alok 
    (Col1 
    ,Col2) 

VALUES 
    (REPLICATE('0', 25 - DATALENGTH(@RowString)) + @RowString 
    , @InsertCol2) 

SET @RowCount = @RowCount + 1 
END 
+0

請包括腳本 –

+1

即使你得到這個工作,它需要幾天才能完成。 – ATC

+0

是的!這一直保持執行2個多小時,然後我停止了它,並試圖通過將RowCount限制爲100來檢查它是否能夠正常工作。然後,我收到了數據類型轉換的錯誤。 – Alok

回答

2

在自動提交事務中插入5,000,000行逐行拼湊行將需要很長時間。

通過簡單地刪除導致錯誤的部分並且應該更快地執行,從而解決了這個問題。

INSERT INTO Alok 
      (Col1, 
      Col2) 
SELECT TOP (5000000) FORMAT(ROW_NUMBER() OVER (ORDER BY @@SPID), 'D25'), 
        ABS(CAST(CRYPT_GEN_RANDOM(8) AS BIGINT)) 
FROM master..spt_values v1, 
     master..spt_values v2 
+0

謝謝你馬丁!這一個得到了更快的執行。但是,現在如果我還必須填充第三個varchar(256)列,我很困惑,我該如何改變你的腳本。能否請你幫忙。 – Alok

1

這是第一個算術溢出:

DECLARE @Upper INT 
... 
SET @Upper = 9223372036854775807 

如果更改到BIGINT,這是第二個:

DECLARE @Random INT 
... 
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) 

一旦你改變那些BIGINT的,刀片應該開始接替

+0

而且,它工作。謝謝詹姆斯! – Alok