SQL Server Express Editionで大量のデータを読み込む方法


拙著『Webアプリケーション構築入門』では、ウェブアプリの簡単な例として、郵便番号検索システムを、Javaを使って構築しています。(改訂版

ウェブアプリに関してはもう1冊著書があります。『Microsoft Visual Web Developer 2008 Express Edition入門』です。こちらはASP.NET(C#あるいはVisual Basic)なのですが、『Webアプリケーション構築入門』で作成した程度の簡単な郵便番号検索システムなら、こちらのほうが簡単に構築できます。

しかし、郵便番号データをSQL Server Express Editionで使えるようにするのが少し面倒なので、その方法を紹介します。(この点に関して言えば、SQL Server Express EditionよりもMySQLのほうがはるかに簡単です。)

まず、郵便番号データをダウンロードします。「読み仮名データの促音・拗音を小書きで表記するもの」の「全国一括」でいいでしょう。ダウンロードしたファイルを展開し、テキストファイル内の二重引用符を削除し、カンマをタブに置き換えておきます(後述のformat.fmtの「\t」を「,」にするなら、カンマの変換は実は不要です)。

Visual Web Developer(VWD, Visual Studioのウェブアプリ用無償版)上では、大量のデータを読み込むためのBULK INSERT文が(たぶん)使えないので、SQL Server Management Studioでデータベースとテーブルを作り、それをVWDで使うことにします。

データベースを作ります。

データベース名は「mydb」にしましょう。

GUIでテーブルを作るのは面倒なので、SQLを使います。

実行するSQLはこんな感じです。

USE [mydb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[zips](
[jis] [char](10) NOT NULL,
[old_zip] [char](5) NOT NULL,
[zip] [char](7) NOT NULL,
[addr1_ruby] [ntext] NOT NULL,
[addr2_ruby] [ntext] NOT NULL,
[addr3_ruby] [ntext] NOT NULL,
[addr1] [ntext] NOT NULL,
[addr2] [ntext] NOT NULL,
[addr3] [ntext] NOT NULL,
[establishment_ruby] [ntext] NOT NULL,
[establishment] [ntext] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[zips] ADD  CONSTRAINT [DF_zips_jis]  DEFAULT ('') FOR [jis]
GO
ALTER TABLE [dbo].[zips] ADD  CONSTRAINT [DF_zips_addr1_ruby]  DEFAULT ('') FOR [addr1_ruby]
GO
ALTER TABLE [dbo].[zips] ADD  CONSTRAINT [DF_zips_addr1]  DEFAULT ('') FOR [addr1]
GO
ALTER TABLE [dbo].[zips] ADD  CONSTRAINT [DF_establishment_ruby]  DEFAULT ('') FOR [establishment_ruby]
GO
ALTER TABLE [dbo].[zips] ADD  CONSTRAINT [DF_establishment]  DEFAULT ('') FOR [establishment]
GO

貼り付けて、右クリック→実行。

できたテーブルは「デザイン」で確認できます。

実は、先にあげたSQL文は、GULで作ったテーブルを「スクリプト化」したものです。(GUIは説明には不向きです。)

テーブルができたので、テキストファイルのデータをテーブルにロードします。

まず、テキストファイルとテーブルの対応関係を記述したファイルformat.fmtを用意します。(ファイルの書き方SQLCHAR等について

format.fmt
10.0
10
1 SQLCHAR 0 10 "\t" 1 jis ""
2 SQLCHAR 0 5 "\t" 2 old_zip ""
3 SQLCHAR 0 7 "\t" 3 zip ""
4 SQLCHAR 0 500 "\t" 4 addr1_ruby ""
5 SQLCHAR 0 500 "\t" 5 addr2_ruby ""
6 SQLCHAR 0 500 "\t" 6 addr3_ruby ""
7 SQLCHAR 0 500 "\t" 7 addr1 ""
8 SQLCHAR 0 500 "\t" 8 addr2 ""
9 SQLCHAR 0 500 "\t" 9 addr3 ""
10 SQLCHAR 0 500 "\r\n" 0 dummy ""

BULK INSERT文で郵便番号データを読み込みます。(参考:BULK INSERT文の詳細)。

BULK INSERT [dbo].[zips]
FROM 't:\KEN_ALL_CP932.TSV'
WITH(FORMATFILE='t:\format.fmt',CODEPAGE=932)

データを読み込み終わったら、データベースを「デタッチ」します。

このデータベースのファイルmydb.mdfをVWDのソリューション・エクスプローラでフォルダApp Dataにドラッグ&ドロップすれば、ウェブアプリから利用できます。

完成したデータベースのファイルmydb.mdf

「郵便番号検索システムの作成(ASP.NETチュートリアル)」に続く

米MS、特許主張しない約束をC#とCLI標準に適用、Monoはソースコードを2分割へ

SQL Server Express Editionで大量のデータを読み込む方法” への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です