2018年12月31日月曜日

SQL ServerのBulk Insertによるデータインポート

テキストファイルのデータを一括でTableにインポートする方法として
Bulk Insertを使ってみる。
AdventureWorksLT2012 の Customer Tableのデータを TestDB (ユーザー定義)のCustomer2 TableにInsertする例を作成する。
前提として、SQL Server のユーザー定義のDB:TestDB に AdventureWorksLT2012 のCustomer Tableと同じデータ型のTable:Customer2 を作成する。

環境

  • SQL Server: SQL Server 2012 SP4 (11.0.7001.0 (X64))
    Evaluation or Express
  • 元データ: AdventureWorksLT2012
  • Import先:TestDB

Import用のTable作成

以下のCreate Table文を[TestDB]で実行する。
USE[TestDB]

IF OBJECT_ID('[dbo].[Customer2]', 'U') IS NOT NULL
  DROP TABLE [dbo].[Customer2]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Customer2](
[CustomerID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[NameStyle] bit NOT NULL,
[Title] [nvarchar](8) NULL,
[FirstName] nvarchar(50) NOT NULL,
[MiddleName] nvarchar(50) NULL,
[LastName] nvarchar(50) NOT NULL,
[Suffix] [nvarchar](10) NULL,
[CompanyName] [nvarchar](128) NULL,
[SalesPerson] [nvarchar](256) NULL,
[EmailAddress] [nvarchar](50) NULL,
[Phone] nvarchar(25) NULL,
[PasswordHash] [varchar](128) NOT NULL,
[PasswordSalt] [varchar](10) NOT NULL,
[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Customer_CustomerID] PRIMARY KEY CLUSTERED 
(
[CustomerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [AK_Customer_rowguid] UNIQUE NONCLUSTERED 
(
[rowguid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Import用のデータをCSVファイルで作成

AdventureWorksLT2012 のCustomer TableのデータをCSVファイルにBCPコマンドを使って書き出す。(前回の記事を参照
対象のデータに「,」が含まれている場合があるので、安易にカンマ区切りにしないこと。
データの区切り文字は適切に選択する。(今回は「;」を採用)
PS C:\Users\hoge> bcp AdventureWorksLT2012.SalesLT.Customer  out "c:\Temp\Customer.txt" -S 192.168.1.50\SQLEVA -T -c -t";"

コピーを開始しています...

847 行コピーされました。
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 16     平均 : (52937.50 行/秒)
出力結果

enter image description here

Bulk Insert

SSMSを起動し以下のクエリを実行
USE [TestDB]
TRUNCATE TABLE  Customer2;

BULK INSERT [dbo].[Customer2]
FROM 'c:\Temp\Customer.txt' 
WITH (FIELDTERMINATOR = ';', 
ROWTERMINATOR = '\n');

SELECT @@ROWCOUNT;

SELECT * FROM Customer2;
※WITH句の説明
FIELDTERMINATOR : 列の区切りの指定
ROWTERMINATOR : 行の区切りの指定


実行結果

enter image description here



参考

BULK INSERT (Transact-SQL)

CSV ファイルを BULK INSERT を使ってインポートする


まとめ

  • Bulk Insertのデータ元ファイルはBCPコマンドで出力した場合のデータと同じく1行目からデータ行となっていること(列名のヘッダを含まない)。
  • 列の区切り文字は文字列データに含まれない文字を使うこと(若しくは置換しておく)

0 件のコメント:

コメントを投稿