首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 WHILE 迴圈批次插入百萬筆測試資料:純 T-SQL 實作範例

     編輯:關於SqlServer

測試分頁、索引、鎖定行為時常需大量測試資料。純 T-SQL WHILE 迴圈即可在資料庫端完成百萬筆插入,無需外部程式,簡單且可控。

基本範例 (插入 100 萬筆)


DECLARE @i INT = 1;
WHILE @i <= 1000000
BEGIN
    INSERT INTO dbo.Manager (UserName, UserPwd) VALUES ('kgdiwss', '250');
    SET @i = @i + 1;
END;

進階版:產生多樣化測試資料


DECLARE @i INT = 1, @batchSize INT = 10000;
SET NOCOUNT ON;  -- 關閉 "n rows affected" 訊息,大幅提升速度

WHILE @i <= 1000000
BEGIN
    -- 批次插入減少編譯/日誌刷新開銷
    INSERT INTO dbo.TestTable (Id, Name, CreateDate, Status, Score)
    SELECT TOP (@batchSize)
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + @i - 1,
        'User_' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + @i - 1 AS VARCHAR(20)),
        DATEADD(day, -ABS(CHECKSUM(NEWID())) % 3650, GETDATE()),  -- 過去 10 年隨機日期
        ABS(CHECKSUM(NEWID())) % 3,                                 -- 0/1/2 隨機狀態
        ABS(CHECKSUM(NEWID())) % 100                                -- 0-99 隨機分數
    FROM sys.all_objects a CROSS JOIN sys.all_objects b;  -- 產生足夠行數的虛擬表

    SET @i = @i + @batchSize;
    -- 可選:每批次檢查點、日誌備份、RAISERROR 進度回報
END;

關鍵加速技巧

更快選項:bcp / BULK INSERT / 生成器工具

  • 預先產生文字檔 → bcp / BULK INSERT 匯入 (最快、平行化)
  • SQL Data Generator (Redgate)、dbForge Data Generator、自製 Python/Faker 腳本產生 CSV
  • 資料庫專案 (SSDT) 預部署腳本內嵌測試資料

清理測試資料


TRUNCATE TABLE dbo.TestTable;  -- 秒級清空、重置 Identity、最小日誌
-- 或
DELETE FROM dbo.TestTable;     -- 可觸發 Trigger、逐列記錄日誌、較慢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技巧效果
SET NOCOUNT ON減少網路封包與用戶端處理,速度提升 20-30%
批次插入 (批次 1000-10000)單筆迴圈每次編譯/日誌刷新,批次僅一次,速度提升 10-50 倍
簡單復原模式ALTER DATABASE TestDB SET RECOVERY SIMPLE 減少日誌寫入
最小化索引插入前刪除非必要索引,插入後重建
TABLOCK 提示INSERT INTO dbo.TestTable WITH (TABLOCK) ... 取得表鎖,最小化日誌 (需簡單/大量記錄復原模式)