1. Top
  2. Tips

SQL Serverで大量データを追加(insert)する方法(その1)

SQL Serverで大量データを一括登録するについて、
・bcp ユーティリティ
・BULK INSERT (Transact-SQL)
 ※コマンド:
 BULK INSERT testDB.dbo.ORDER_DATA 'C:\SQL\order_testdata.csv' with(formatfile = 'C:\SQL\ORDER_DATA.fmt');

方法以外に、簡単でSQLを作成して、ループして登録する方法もあります。

※BULK INSERTステートメントは最も高速にインポートできる!と言われています。

サンプルDBの作成

SQL Serverで大量データを一括登録する用DB構築する。
【CreateDatabase.sql】

USE master
GO
CREATE DATABASE testDB
ON PRIMARY
( NAME = testDB_dat,
  FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\testDB.mdf',
  SIZE = 100MB
)
LOG ON
( NAME = testDB_log,
  FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\testDB.ldf',
  SIZE = 100MB
)
GO
ALTER DATABASE testDB SET READ_COMMITTED_SNAPSHOT ON
GO
ALTER DATABASE testDB SET ALLOW_SNAPSHOT_ISOLATION ON
GO
PRINT 'testDB データベースを作成しました。'
GO




ページの先頭へ

テーブル作成

SQL Serverで大量データを一括登録する用テーブルを作成する。
【CreateTable.sql】
CREATE TABLE ORDER_DATA(
    SHOP_NO char(4) NOT NULL,
    ORDER_DATE char(10) NOT NULL, --YYYY/MM/DD
    TRANSACTION_ID char(10) NOT NULL,
    OPERATOR_ID varchar(8) NOT NULL,
    COMMENT varchar(20) NOT NULL,
    REQUEST_DATE datetime NULL,
    UPDATE_DATE datetime NULL,
    PRIMARY KEY (SHOP_NO, ORDER_DATE, TRANSACTION_ID)
)
GO
PRINT '受注テーブルを作成しました。'




ページの先頭へ

大量データを追加するSQL

一括登録するSQLサンプルです。
print GetDate()
USE testDB
GO

DECLARE @iYear          INT
DECLARE @iMonth         INT
DECLARE @iShop          INT
DECLARE @iTransactionId INT
DECLARE @sYear          CHAR(4)
DECLARE @sOrderDate     CHAR(10)
DECLARE @sShop          CHAR(4)
DECLARE @sTransactionId VARCHAR(10)
DECLARE @sOperatorId    CHAR(8)
DECLARE @dRequestDate   DATETIME


-- 店舗番号:100~200
SET @iShop = 100
WHILE @iShop <= 200
BEGIN
    SET @sShop = '0' + CONVERT(CHAR, @iShop)
    SET @sOperatorId = @sShop + '1234' 
    SET @iYear = 2010
    WHILE @iYear <= 2010
    BEGIN
        SET @iMonth = 1
        WHILE @iMonth <= 12
        BEGIN
            SET @sOrderDate = convert(CHAR(4),@iYear) + '/' + right(('00' + convert(VARCHAR,@iMonth)),2) + '/01'
            SET @dRequestDate = convert(DATETIME, @sOrderDate)
			-- 1ヶ月トランザクションデータは 100件とする
            SET @iTransactionId = 1
            WHILE @iTransactionId <= 100
            BEGIN
                SET @sTransactionId = right(('0000000000' + convert(VARCHAR,@iTransactionId)),10)
                INSERT INTO 
                ORDER_DATA(SHOP_NO,ORDER_DATE,TRANSACTION_ID,OPERATOR_ID,COMMENT,REQUEST_DATE,UPDATE_DATE)  
                VALUES(@sShop,@sOrderDate,@sTransactionId,@sOperatorId,'1234567',@dRequestDate,@dRequestDate)
                SET @iTransactionId = @iTransactionId + 1
            END
            SET @iMonth = @iMonth + 1
        END
        SET @iYear = @iYear + 1
    END
SET @iShop = @iShop + 1
END

PRINT '--------------------------------'
print GetDate()






ページの先頭へ