Sql-Server

如何將假數據填充/插入到 MS Sql Server

  • March 12, 2020

我正在嘗試測試MS Sql Server 的一些配置設置,FILEGROUP為此我希望填滿我的FILEGROUP磁碟,以便它開始填充 2nd FILEGROUP

我剛剛創建了一個虛擬表,PRIMARY FILEGROUP並有以下簡單的 sql 來插入一些數據。它只是花了很長時間,慢慢地填充它。有沒有更好的方法來快速填充一個真正佔用大量硬碟空間的垃圾數據表?

--IF OBJECT_ID('dbo.__RandomData', 'U') IS NOT NULL 
--BEGIN
--    DROP TABLE dbo.__RandomData; 

--    CREATE TABLE dbo.__RandomData ( 
--        RowId INT IDENTITY(1,1) NOT NULL, 
--        SomeInt INT,
--        SomeBit BIT, 
--        SomeVarchar VARCHAR(10), 
--        SomeDateTime DATETIME, 
--        SomeNumeric NUMERIC(16,2) ) 
--END
--GO

DECLARE @count INT 
SET @count = 1

WHILE @count <= 1000000
BEGIN
INSERT INTO dbo.__RandomData 
   SELECT    @count, 
           CASE WHEN DATEPART(MILLISECOND, GETDATE()) >= 500 THEN 0 ELSE 1 END [SomeBit], 
           CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
           CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
           CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
           CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
           CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [SomeVarchar], 
           DATEADD(MILLISECOND, (ABS(CHECKSUM(NEWID())) % 6000) * -1, 
               DATEADD(MINUTE, (ABS(CHECKSUM(NEWID())) % 1000000) * -1, GETDATE())) [SomeDateTime], 
           (ABS(CHECKSUM(NEWID())) % 100001) + ((ABS(CHECKSUM(NEWID())) % 100001) * 0.00001) [SomeNumeric]
   SET @count += 1
END

在 sys.columns 之間進行 CROSS JOIN,使用相同的 2、3 或 4 次。有一個 TOP,有盡可能多的行。使用它作為 INSERT … SELECT 的基礎。

CREATE TABLE mytable(c1 int identity(1, 1), c2 char(10))

INSERT INTO mytable
SELECT TOP(1000) 'Hello'
FROM sys.columns AS a 
CROSS JOIN sys.columns AS b 
CROSS JOIN sys.columns AS c

交叉連接是一個經典的技巧。在兩個表之間進行交叉連接,每個表有 1000 行,結果中有 1,000,000 行。使用 3 個表,您有 1,000,000,000 行。您可以為這些目的創建一些“數字”表,例如其中包含 1000 行。或者,快速而骯髒地使用一些您知道存在的視圖,其中包含相當數量或行(如 sys.columns)。

引用自:https://dba.stackexchange.com/questions/261556