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 行/秒)
出力結果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 : 行の区切りの指定
実行結果
参考
BULK INSERT (Transact-SQL)CSV ファイルを BULK INSERT を使ってインポートする
まとめ
- Bulk Insertのデータ元ファイルはBCPコマンドで出力した場合のデータと同じく1行目からデータ行となっていること(列名のヘッダを含まない)。
- 列の区切り文字は文字列データに含まれない文字を使うこと(若しくは置換しておく)
0 件のコメント:
コメントを投稿