2017-03-05 74 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