SQL Server 2008 自習書シリーズ No.3
データのコピーと現場で役立つ便利な操作集
Published: 2008 年 4 月 30 日 改訂版: 2008 年 11 月 30 日 有限会社エスキューエル・クオリテゖ
この文章に含まれる情報は、公表の日付の時点での Microsoft Corporation の考え方を表しています。市場の変化に応える必要があるた め、Microsoft は記載されている内容を約束しているわけではありません。この文書の内容は印刷後も正しいとは保障できません。この文章 は情報の提供のみを目的としています。
Microsoft、SQL Server、Visual Studio、Windows、Windows XP、Windows Server、Windows Vista は Microsoft Corporation の米国
およびその他の国における登録商標です。
その他、記載されている会社名および製品名は、各社の商標または登録商標です。
目次
S STTEEPP11. . 自自習習書書をを試試すす環環境境ににつついいて ... 4 て 1.1 この自習書の内容について ... 5 1.2 自習書を試す環境について ... 6 1.3 事前作業(サンプル スクリプトのダウンロードとセットゕップ) ... 7 S STTEEPP22. . デデーータタののココピピーーととエエククススポポーート ... 9 ト 2.1 テーブルをコピーする: SELECT .. INTO ...10 2.2 データをコピーする: INSERT .. SELECT...15 2.3 クエリ エデゖタで CSV 形式の結果を出力する ...17 2.4 bcp コマンドで CSV フゔル出力(エクスポート) ...20 2.5 bcp コマンドで CSV フゔル入力(ンポート) ...22 S STTEEPP33. . IInntteeggrraattiioonnSSeerrvviicceess にによよるる エエククススポポーートトととンンポポーート ...24 ト 3.1 Integration Services の概要 ...25 3.2 Integration Services による CSV フゔルへのエクスポート ...28 3.3 Integration Services による CSV フゔルのンポート ...33 3.4 Access データベース(.mdb)のンポート ...42 3.5 OPENROWSET による外部データのクエリ ...52 3.6 OPENROWSET .. BULK によるテキスト フゔルのンポート...56 3.7 リンク サーバーによる外部データのクエリ ...59 S STTEEPP44. . テテーーブブルル関関連連のの便便利利なな操操作 ...64 作 4.1 自動的に連続番号を振る: IDENTITY プロパテゖ ...65 4.2 データの全削除を高速に実行する: TRUNCATE TABLE ...72 4.3 列に既定値を設定する: DEFAULT 値 ...73S
S
T
T
E
E
P
P
1
1
.
.
自
自
習
習
書
書
を
を
試
試
す
す
環
環
境
境
に
に
つ
つ
い
い
て
て
この STEP では、この自習書で取り扱う内容と、自習書を試す環境について説明 します。 この STEP では、次のことを学習します。 この自習書の内容について 自習書を試す環境について 事前作業(サンプル スクリプトのダウンロードとセットゕップ)1.1 この自習書の内容について
この自習書の内容について
この自習書では、データやテーブルを単純にコピーする方法や、CSV(カンマ区切り)フゔルへ の出力 / 入力、外部データ(リモートの SQL Server や Access データベース、Excel フゔ ル、Oracle データベースなど)に対するクエリの実行方法、一括ンポート時の MERGE ステ ートメント連携など、現場で必ず役立つ便利な操作方法について説明しますので、ぜひチャレンジ してみください。
この自習書で取り扱う主な内容は、次のとおりです。
データとテーブルのコピー(SELECT .. INTO、INSERT .. INTO) CSV フゔル形式での出力 bcp コマンドによる CSV フゔルのンポートとエクスポート Integration Services ウゖザードによるンポート / エクスポート OPENROWSET を利用した外部データのクエリ(Access、Excel、Oracle など) 一括ンポート時の MERGE ステートメント連携 リンク サーバーを利用した外部データのクエリ テーブルの自動連番の設定(IDENTITY プロパテゖ) 列の既定値の設定(DEFAULT 値) なお、SQL Server 間でデータベースを移動するシナリオ(開発機から本番機、あるいはその逆へ データベースを移動する方法)については、本自習書シリーズの「バックゕップと復元」で、詳し く説明しています。
1.2 自習書を試す環境について
必要な環境
この自習書で実習を行うために必要な環境は次のとおりです。
OS
Windows Server 2003 SP2(Service Pack 2) 以降 または Windows XP Professional SP2 以降 または
Windows Vista または Windows Server 2008
ソフトウェア
SQL Server 2008 Enteprise / Developer / Standard / Workgroup Edition
この自習書内での画面やテキストは、OS に Windows Server 2003 SP2、ソフトウェゕに SQL Server 2008 Enterprise Edition を利用して記述しています。
そのほか
この自習書を試すには、サンプル スクリプトをダウンロードして、次のページの事前作業を実 行しておく必要があります。
1.3 事前作業(サンプル スクリプトのダウンロードとセットアップ)
事前作業
自習書を進めるには、サンプル スクリプトをダウンロードしておく必要があります。また、自習 書を進めるにあたっての事前作業として、Management Studio のクエリ エデゖタからサンプル スクリプト内にある「CreateTables.txt」を実行して、「sampleDB」データベースと「社員」 テーブルを作成しておく必要があります(実行手順は、次のとおりです)。 1. Management Studio を起動するには、[スタート]メニューの[すべてのプログラム]か ら、[Microsoft SQL Server 2008]を選択して[SQL Server Management Studio]をク リックします。 2. 起動後、[サーバーへの接続]ダゕログで、[サーバー名]へ SQL Server の名前を入力し、 [接続]ボタンをクリックします。 3. 接続完了後、Management Studio が開いたら、次のようにツールバーの[新しいクエリ] をクリックして、クエリ エデゖタを開きます。 1 2 「新しいクエリ」をクリックします 1 クエリ エディタ が表示される4. 次に、Windows エクスプローラを起動して、サンプル スクリプトをダウンロードしたフォ ルダを展開し、このフォルダ内の「CreateTables.txt」フゔルをダブル クリックして開き ます。フゔルの内容をすべてコピーして、クエリ エデゖタへ貼り付けます。 貼り付け後、ツールバーの[!実行]ボタンをクリックしてクエリを実行します。これにより、 「sampleDB」という名前のデータベースが作成され、その中へ「社員」テーブルが作成さ れます。実行後、「社員」テーブルの 6 件のデータが表示されれば、実行が完了です。 2 サンプル スクリプト内の「CreateTables.txt」 フゔルの内容をコピー して貼り付け 1 結果を確認 3
S
S
T
T
E
E
P
P
2
2
.
.
デ
デ
ー
ー
タ
タ
の
の
コ
コ
ピ
ピ
ー
ー
と
と
エ
エ
ク
ク
ス
ス
ポ
ポ
ー
ー
ト
ト
この STEP では、SELECT ステートメントで取得した結果をもとに、新しくテー ブルを作成したり、別のテーブルへコピーしたり、CSV フゔル形式へエクスポ ートする方法について説明します。 この STEP では、次のことを学習します。 テーブルをコピーする: SELECT .. INTO データをコピーする: INSERT .. SELECT クエリ エデゖタで CSV 形式の結果を出力する bcp コマンドで CSV フゔルへの出力(エクスポート) bcp コマンドで CSV フゔルからの入力(ンポート)2.1 テーブルをコピーする: SELECT .. INTO
SELECT .. INTO
SQL Server では、SELECT .. INTO(SELECT ステートメントで INTO 句)を利用すると、 SELECT ステートメントで取得した結果をもとにテーブルを作成することができます。これは、次 のように記述します。
SELECT * INTO 新しいテーブル名 FROM テーブル名
Let's Try
それでは、これを試してみましょう。
1. まずは、[スタート]メニューの[すべてのプログラム]から[Microsoft SQL Server 2008] を選択し、[SQL Server Management Studio]をクリックして、Management Studio を 起動します。 2. SQL Server への接続画面が表示されたら、[サーバーの種類]で「データベース エンジン」 を選択し、[サーバー名]で SQL Server の名前を入力します。 [認証]では、「Windows 認証」を選択して、[接続]ボタンをクリックします(認証につ いては、本自習書シリーズの「ログン認証とオブジェクト権限」で詳しく説明しています)。 1 2
3. Management Studio が起動したら、次のようにツールバーの[新しいクエリ]ボタンをク リックして、[クエリ エディタ]を開きます。 4. クエリ エデゖタでは、次のように入力して、sampleDB データベースへ接続し、「社員」テ ーブルのデータを参照します。 USE sampleDB SELECT * FROM 社員 「社員」テーブルの 6 件のデータを取得できたことを確認できます。 5. 次に、SELECT .. INTO を利用して、「社員」テーブルのデータをもとに、新しく「社員コピ ー」テーブルを作成してみましょう。 USE sampleDB
SELECT * INTO 社員コピー FROM 社員
「新しいクエリ」をクリック 1 クエリ エディタ が表示される SQL を記述 1 [!実行]をクリック 2 社員テーブルの 中身が表示される 3 sampleDB データベースへ接続 社員テーブルを検索
「6 行処理されました」と表示されれば、正しくデータのコピーが完了しています。このよう に、通常の SELECT ステートメントへ “INTO 新しいテーブル名” を追加するだけで、 SELECT ステートメントで取得した結果をもとに INTO 句で指定したテーブルを作成でき るようになります。 6. コピーした「社員コピー」テーブルのデータを確認しておきましょう。 SELECT * FROM 社員コピー 「社員」テーブルのデータが、すべてコピーされていることを確認できます。 7. 次に、作成した「社員コピー」テーブルの定義を確認してみましょう。次のように、オブジェ クト エクスプローラで sampleDB データベースの[テーブル]フォルダを右クリックして、 [最新の情報に更新]をクリックします。 「社員コピー」テーブルが表示されたら、これを展開し、列名やデータ型、NULL を許可する 列名とデータ型、NULL を許可 するかどうかは、元のテーブル と同じようにコピーされている ↓ 1 2
かどうかなどの定義が、コピー元のテーブルと同じであることを確認できます。
Note: SELECT .. INTO では制約はコピーされない
SELECT .. INTO では、制約(主キー制約や外部キー制約、CHECK 制約など)をコピーすることはできません。 制約をコピーしたい場合には、別途、次のようにスクリプト生成機能などを利用して、コピー先で、制約を再作成 する必要があります。 ■ 制約のスクリプト生成 制約のスクリプトを生成するには、次のようにテーブルを右クリックして、[テーブルをスクリプト化]から [CREATE]→「新しいクエリ エディタ ウィンドウ」をクリックします。 これにより、テーブルを作成するためのスクリプト(CREATE TABLE)が生成されて、合わせて、制約を作成す るためのスクリプト(ALTER TABLE .. CONSTRAINT)も生成されます。
なお、主キー制約は、次のように CREATE TABLE ステートメントの中へ生成されています。
主キー制約もスクリプト化 されている
データをコピーせずにテーブル定義のみをコピーする
次に、SELECT .. INTO を利用して、テーブル定義のみをコピーしてみましょう。
1. 前の手順と同じように SELECT .. INTO を利用して、「社員」テーブルのテーブル定義のみ をコピーした「社員コピー2」という名前の新しいテーブルを作成してみましょう。このとき、 WHERE 句の条件式へ「社員番号 = -1」を付けて実行するようにします。
SELECT * INTO 社員コピー2 FROM 社員
WHERE 社員番号 = -1 「0 行処理されました」と表示されるのがポントです。「社員」テーブルの中には、「社員番 号」が ”-1” のデータは存在しないので、0 件と表示されています。これにより、データは、 1 件もコピーされずに、テーブルの定義だけをコピーして、「社員コピー2」テーブルを作成す ることができています。このように、WHERE 句の条件式で、結果が 0件になるように記述 すると、テーブル定義だけをコピーできるようになります。 なお、WHERE 句の条件式へは、“WHERE 1=2” のように、成り立たない条件式を記述した 場合にも、結果が 0 件になるので、テーブル定義のみをコピーする目的として利用すること ができます。
2.2 データをコピーする: INSERT .. SELECT
INSERT .. SELECT
前述の SELECT .. INTO は、データのコピーとともに、新しくテーブルを作成するので、既に存 在するテーブルに対してデータをコピーする目的としては利用できません。既存のテーブルへデー タをコピーしたい場合には、INSERT .. SELECT を利用します。これは、次のように利用します。 INSERT INTO テーブル名 SELECT ステートメントこれにより、SELECT ステートメントで取得した結果を INSERT INTO で指定したテーブルへコ ピーできるようになります。
Let's Try
それでは、これを試してみましょう。 1. まずは、「sampleDB」データベース内へ、次のように「emp」という名前のテーブルを作成 します。 USE sampleDBCREATE TABLE emp ( empNo int
,empName char(50) )
2. 次に、INSERT .. SELECT を利用して、「社員」テーブルの「社員番号」と「氏名」列を、「emp」 テーブルの「empNo」と「empName」列へ、それぞれコピーしてみましょう。
INSERT INTO emp
既存の「emp」テーブルへ、「社員」テーブルの「社員番号」と「氏名」列のデータをコピー できたことを確認できます。このように INSERT .. SELECT を利用すると、既存のテーブ ルへデータをコピーできるようになります。
Note: INSERT 先のテーブルの列数と SELECT ステートメントで取得する列数を同じにする
INSERT .. SELECT では、INSERT 先のテーブルの列数と SELECT ステートメントで取得する列数が異なる場合 には、エラーが発生します。たとえば、次のように列数が異なる場合は、エラーが発生して、データのコピーに失 敗します。
2.3 クエリ エディタで CSV 形式の結果を出力する
クエリ エディタで CSV 形式の結果を出力
Management Studio の「クエリ エデゖタ」では、SELECT ステートメントで取得した結果を CSV 形式(カンマ区切りのテキスト形式)へ変換して出力することができます。
Let's Try
それでは、これを試してみましょう。 1. まずは、次のようにクエリ エデゖタ上の任意の領域を右クリックして、[結果の出力]の[結 果をテキストで表示]をクリックします。 これで、グリッド形式ではなく、テキスト形式でクエリ結果を取得できるようになります。 2. 続いて、もう一度、クエリ エデゖタ上の任意の領域を右クリックして、[クエリ オプション] をクリックします。 [結果をテキストで表示]を クリック。デフォルトは、 [結果をグリッドに表示] 1 [クエリ オプション]をクリック 13. これにより、[クエリ オプション]ダゕログが表示されるので、左ペンで[結果]を展開 して[テキスト]をクリックします。 次に、右ペンの[出力形式]で[コンマ区切り]を選択して、[OK]ボタンをクリックしま す。以上で、設定が完了です。 4. それでは、「社員」テーブルのデータを参照してみましょう。 USE sampleDB SELECT * FROM 社員 結果が、カンマ区切りの CSV 形式で出力されたことを確認できます。このように、クエリ エ デゖタの出力形式を「コンマ区切り」へ設定すると、SELECT ステートメントの実行結果を、 CSV 形式で取得できるようになります。
Note: char 型の余分なスペースをトルには RTRIM 関数
上の手順では「氏名」列のデータの右側へ余分なスペースが含まれています。これは、「氏名」列のデータ型を char(50) で定義しているためです。この右側の余分なスペースを取り除くには「RTRIM」という関数を次のよ うに利用します。 [テキスト]を選択 1 [出力形式]で[コンマ 区切り]を選択。デフォ ルトは[固定列] 2 3
RTRIM 関数については、本自習書シリーズの「Transact-SQL 入門」で詳しく説明しています)
5. 最後に、デフォルトのグリッド形式で結果が出力されるように戻しておきましょう。グリッド 形式へ戻すには、次のようにクエリ エデゖタ上の任意の領域を右クリックして、[結果の出力] の[結果をグリッドに表示]をクリックします。
2.4 bcp コマンドで CSV ファイル出力(エクスポート)
bcp コマンドで CSV ファイル出力(エクスポート)
SQL Server のデータを、CSV 形式のフゔルへ出力するには、bcp コマンドを利用することも できます。bcp コマンドの構文は、次のとおりです。 bcp テーブル名 out CSVファイル名 /S SQL Server 名 /T /c /t "," 指定しているオプションの役割は、次のとおりです。 /S で SQL Server の名前を指定し、/T で Windows 認証での接続、/c でテキスト形式での出 力、/t ”,” でカンマ区切りを指定できます。/T と /t は、異なるオプションなので(大文字と小 文字が区別されるので)、注意してください。 bcp コマンドは、「コマンド プロンプト」ツールから実行する必要があります。コマンド プロン プトは、次のように[スタート]メニューの[アクセサリ]から、[コマンド プロンプト]をクリ ックして、起動することができます。Let's Try
それでは、これを試してみましょう。 オプション 役割 /S SQL Server の名前 /T Windows 認証でSQL Server へ接続 /c テキスト形式で出力 /t 列区切りを示す記号を指定(”,”と記述した場合はカンマ区切り、省略時は Tab 区切り)1. まずは、[スタート]メニューからコマンド プロンプトを起動します。
2. コマンド プロンプトが起動したら、次のように bcp コマンドを入力して、「社員」テーブル のデータを「C:\shain.txt」フゔル(CSV 形式)へ出力してみましょう。
bcp sampleDB.dbo.社員 out C:\shain.txt /S Server1 /T /c /t ”, ”
/S オプションに指定した “Server1” は、SQL Server の名前(ンスタンス名)になるの で、皆さんの環境に合わせて変更してください。また、テーブル名の指定は “データベース名. スキーマ名.テーブル名” と記述する必要があることに注意してください(スキーマにについ ては、本自習書シリーズの「ログン認証とオブジェクト権限」で詳しく説明しています。 コマンドを実行後、”コピーを開始しています...” と表示されて、その後 “n 行コピーされま した” と表示されれば成功です。 2. 次に、Windows エクスプローラを起動して、「C:\shain.txt」フゔルが作成されているこ とを確認します。 CSV 形式でフゔルが作成されていることを確認できます。 Note: bcp は何の略?
bcp は、Bulk Copy の略です。Bulk は、「一括 / 大量 / バラ積み」という意味なので、bcp は “一括コピー プ
ログラム” と呼ばれることもあります。 bcp コマンドを入力後 [ENTER]キーを押す。 1 メモ帳で「C:¥shain.txt」フゔル を開いて、結果を確認。「氏名」列 は char 型なので余分な空白あり 2 ダブル クリック 1
2.5 bcp コマンドで CSV ファイル入力(インポート)
bcp コマンドで CSV ファイル入力(インポート)
bcp コマンドでは、テキスト フゔルをンポートする機能もあります。これは、次のように利 用します。 bcp テーブル名 in CSVファイル名 /S SQL Server 名 /T /c /t ”, ” 出力するときとの違いは、“out” を “in” へ変更しただけです。Let's Try
それでは、これを試してみましょう。 1. 前の step で出力した「C:\shain.txt」を、Step 2.1で作成した「社員コピー2」テーブル へンポートしてみましょう。コマンド プロンプトを起動して、次のように入力します。bcp sampleDB.dbo.社員コピー2 in C:\shain.txt /S Server1 /T /c /t ","
コマンドの実行後、“n 行コピーされました” と表示されれば成功です。
2. 次に、クエリ エデゖタを開いて、「社員コピー2」テーブルを参照して、データが正しくン ポートされているかどうかを確認しておきましょう。
USE sampleDB
Note: bcp コマンドの注意点
bcp コマンドは、単純なデータのコピー用途としては便利ですが、複雑な処理を行うのには適していません。たと えば、ンポート元の CSV フゔルの列数とテーブルの列数が異なる場合や、データにカンマが含まれている場 合には、“フォーマット ファイル” を利用しなければなりません(データにカンマが含まれている場合は、そのカン マが区切り文字として見なされないようにデータを二重引用符で囲むなどの対処が必要になります)。これらの問 題は、次の Step で説明する Integration Services 機能を利用すると簡単に解決することができます。
S
S
T
T
E
E
P
P
3
3
.
.
I
I
n
n
t
t
e
e
g
g
r
r
a
a
t
t
i
i
o
o
n
n
S
S
e
e
r
r
v
v
i
i
c
c
e
e
s
s
に
に
よ
よ
る
る
エ
エ
ク
ク
ス
ス
ポ
ポ
ー
ー
ト
ト
と
と
ン
ン
ポ
ポ
ー
ー
ト
ト
この STEP では、Integration Services のンポート / エクスポート ウゖザー ドを利用したデータのコピーや、OPENROWSET、リンク サーバーを利用した外 部データのクエリ方法について説明します。 この STEP では、次のことを学習します。 Integration Services の概要 CSV フゔルへのエクスポート CSV フゔルのンポート Access データベース(.mdb)のンポート OPENROWSET を利用した外部データのクエリ リンク サーバーを利用した外部データのクエリ3.1 Integration Services の概要
Integration Services の概要
SQL Server 2008 Integration Services(SSIS:データ統合サービス)は、SQL Server の標準 機能として搭載されている、データの「コピー」や「変換」などが行える “データ転送ツール” で す。SQL Server 2000 以前のバージョンでは、DTS(Data Transformation Services:データ変 換サービス)と呼ばれていました。
Integration Services を利用すると、SQL Server 同士でのデータ転送はもちろん、Oracle や DB2、Microsoft Office Access、そのほかの ODBC 対応のデータベース、Microsoft Office Excel フゔル、可変長のテキスト ファイル(カンマ区切り、タブ区切り)、固定長のテキスト フゔ ルなど、さまざまなデータソースから SQL Server へデータを取り込んだり、それとは逆に SQL Server からデータを書き出したりすることができます。
前の Step で紹介した bcp コマンドは、テキスト フゔルとの間での単純なデータ コピーだけ しか行えませんが、Integration Services を利用すると、次のように Access や Excel フゔル、 Oracle などの間で、データのコピーが行えます。 Access データベース(.mdb フゔル)を SQL Server へ取り込むことが可能 メン フレーム・汎用機、 Oracle、DB2、MySQL など Excel フゔル Accessフゔル テキスト フゔル Integration Services は、データ転送・変換ツール さまざまなデータソースとの間で データのコピーと変換が可能! Access データベース(.mdb) SQL Server 2008 コピー
Excel データ(.xls フゔル)を SQL Server へ取り込む(ンポートする) Oracle データベースを SQL Server へ取り込む
インポート / エクスポート ウィザード
Integration Services では、これらのデータ転送は、「インポート / エクスポート ウィザード」 という機能によって、ウゖザード形式(対話形式)で指定された項目を入力、選択するだけで簡単 に実行することができます。 Excel フゔル SQL Server 2008 データ コピー Oracle データベース SQL Server 2008 コピー ンポート / エクスポート ウゖザードSSIS デザイナによるデータ変換
Integration Services には、単純なデータ コピーだけでなく、次のように、データを変換(デー タを加工しながら転送)できる機能もあります。 この機能は、非常に便利で、データ ウェゕハウス(DWH:Data Warehouse)を構築する際には、 欠かせないツールとなります。 このようなデータ変換は、「SSIS デザイナ」ツールを利用して行えます。SSIS デザナを利用 すると、データの転送に加えて、複雑な変換処理を追加したり、次のように転送の前後に行いたい 処理(FTP によるフゔル取得やメール送信、SQL の実行など)を追加したりできるようになり ます。 SSIS デザナについては、この自習書では説明していませんが、本自習書シリーズの 「Integration Services 入門」で詳しく説明しているので、ぜひご覧いただければと思います。 自習書シリーズ「Integration Services 入門」のダウンロードはこちらから http://www.microsoft.com/japan/sqlserver/2008/self-learning/default.mspx#cat02 以降では、Integration Services の「インポート / エクスポート ウィザード」を利用して、CSV フゔルとやり取りする方法と Access データベース(.mdb)をンポートする方法を説明しま データを変換して 転送する 「姓」と「名」を 文字列連結して 「氏名」へ変換 「性別コード」の 1 を「男性」へ、 2 を「女性」へ変換 「部門番号」を 「部門名」へ変換 さまざまなタスク を実行可能 FTP でフゔルを取得し たり、複数のフゔルをま とめて処理する Foreach Loop、メールを送信した りすることもできる SSIS デザナ3.2 Integration Services による CSV ファイルへのエクスポート
インポート / エクスポート ウィザードによるエクスポート
それでは、Integration Services を試してみましょう。まずは、「インポート / エクスポート ウ ィザード」を利用して、「sampleDB」データベースの「社員」テーブルのデータを CSV(カン マ区切り)形式のフゔルへエクスポートしてみましょう。 1. ンポート / エクスポート ウゖザードを起動するには、次のように Management Studio でコピー元のデータベース(sampleDB)を右クリックして、[タスク]メニューの[データ のエクスポート]をクリックします。 2. これにより、ンポート / エクスポート ウゖザードが起動されるので、[次へ]ボタンをク リックして、次へ進みます。 [データのエクスポート] をクリック 1 13. 次の[データソースの選択]画面では、コピー元となるデータを指定します。
今回は、事前に「sampleDB」データベースを選択してウゖザードを起動しているので、[デ ータベース]に「sampleDB」が選択されていることを確認できます。また、[データソース] には「SQL Server Native Client 10.0」が選択されていますが、これは、SQL Server 2008 をコピー元にするという意味です。[サーバー名]には SQL Server の名前が選択されている ことを確認して、[次へ]ボタンをクリックします。 4. 次の[変換先の選択]画面では、変換先(エクスポート先)を指定します。 今回は、CSV フゔルへデータをエクスポートするので、[変換先]で「フラット ファイル 変換先」を選択します。[フゔル名]へは、エクスポート先となる任意のフゔル名(今回 [sampleDB]を選択 1 2 [フラット フゔル 変換先]を選択 1 出力先となるフゔルの 名前を入力 2 テキスト修飾子に「”」 (二重引用符)を入力 3 4
して、データを「"」で囲むようにします。設定後、[次へ]ボタンをクリックします。 5. 次の[テーブルのコピーまたはクエリの指定]画面では、[1 つ以上のテーブルまたはビュー からデータをコピーする]がチェックされていることを確認して、[次へ]ボタンをクリック します。 6. 次の[フラット フゔル変換先の構成]画面では、コピー元となるテーブルを選択します。 今回は、[変換元テーブルまたはビュー]で、「社員」テーブルを選択します。 また、[列区切り記号]で[コンマ{,}]が選択されていることを確認します。これで「社員」 テーブルを CSV 形式へエクスポートできるようになります。設定後、[次へ]ボタンをクリ ックします。 7. 次の[パッケージの保存および実行]画面では、このデータ転送をすぐに実行するか、後から [1つ以上のテーブルまた はビューからデータをコ ピーする]を選択 1 もし、こちらを選択した場合は SELECT ステートメントを記述して、その結果を 変換先へコピーできる。 2 1 2 3
実行するために保存するかを選択します。 今回はすぐに実行するので、[すぐに実行する]がチェックされていることを確認して、[次へ] ボタンをクリックします。 8. 最後の[ウゖザードの完了]画面で[完了]ボタンをクリックすると、データのエクスポート が開始されます。 9. エクスポートが完了すると、次のように[操作は正常に実行されました]画面が表示されます。 [状態]が「成功」と表示されていることを確認して、[閉じる]ボタンをクリックします。 [すぐに実行する]を選択 1 2 [完了]をクリック 2
エクスポートしたデータの確認
10. ウゖザードでエクスポートしたデータを確認するには、Windows エクスプローラを起動して、 「C:\shain2.txt」フゔルをメモ帳で開きます。 それぞれの列がカンマ区切りで表示され、データが「"」(2 重引用符)で囲まれていることを 確認できます。データを ” で囲んでおくと、データ内にカンマがあったとしても、それを区 切り記号と間違えないようになります。このように Integration Services を利用すると、CSV フゔルへのエクスポートを、GUI 操 作だけで簡単に行うことができるようになるので、大変便利です。 1 各列のデータが ” (2重引用符) で囲まれていることを確認。 コピーの完了後、「C:¥shain2.txt」フゔ ルをダブル クリックしてメモ帳で開く 1 ↓
3.3 Integration Services による CSV ファイルのインポート
インポート / エクスポート ウィザードでのインポート
ンポート / エクスポート ウゖザードでは、CSV フゔルを SQL Server 内へンポートする ことも簡単に行えます。Let's Try
それでは、これを試してみましょう。前の Step でエクスポートした「C:\shain2.txt」フゔ ルを SQL Server へンポートしてみましょう。 1. まずは、[スタート]メニューの[すべてのプログラム]→[Microsoft SQL Server 2008] から[データのインポートおよびエクスポート(32 ビット)]をクリックします。 2. ンポート エクスポート ウゖザードが起動されたら、[次へ]ボタンをクリックします。2. 次の[データソースの選択]画面では、データのコピー元を選択します。コピー元がテキスト フゔルの場合は、[データソース]で[フラット ファイル ソース]を選択します。 続いて、[フゔル名]の[参照]ボタンをクリックして、コピー元となるフゔルを選択し ます。次のように[フゔルの場所]で「ローカル ディスク(C:)」を選択します。 C: ドラブ内のすべてのフゔルが表示されたら、「C:\shain2.txt」フゔルを選択して、 [開く]ボタンをクリックします。 3. [データソースの選択]画面へ戻ったら、次のように[フゔル名]へ「Shain2.txt」へのパ スが表示されているのを確認します。 1 2 2 1 3
[テキスト修飾子]へは、「"」(2 重引用符)を入力します。 4. 続いて、次のように[列]ページをクリックして開きます。[列]ページでは、テキスト フゔ ルのデータ形式を設定することができます。 [行区切り記号]に "改行" を表す {CR}{LF} が選択され、[列区切り記号]にコンマ {,} が選択されていることを確認します。今回取り込むフゔルは、CSV(カンマ区切り)フゔ ルなので、このままの設定で大丈夫です。 [1~6 行のプレビュー]には、コピー元の CSV フゔルのデータが表示され、列名が自動 テキスト修飾子に「”」 (二重引用符)を入力 2 1 1 2 3 4 5 列名が「列x」と 命名されている
ボタンをクリックします。
5. 次の[変換先の選択]画面では、コピー先を指定します。今回は、SQL Server へンポート するので、[変換先]で「SQL Server Native Client 10.0」を選択し、[サーバー名]へ SQL Server の名前を入力します。 [データベース]へは、ンポート先となるデータベースを選択しますが、ここでは[新規作 成]ボタンをクリックして、新しくデータベースを作成します。 [データベースの作成]ダゕログが表示されたら、[名前]へ新しく作成する任意のデータ ベース名(今回は、SSISDB)を入力し、[OK]ボタンをクリックします。これで、SSISDB という名前のデータベースが作成されます。 1 2 1 2
6. [変換先の選択]画面へ戻ったら、[次へ]ボタンをクリックして次の画面へ進みます。 7. 次の[コピー元のテーブルおよびビューを選択]画面では、ンポート元とンポート先とな るテーブルを指定します。今回のようにンポート元がテキスト フゔルの場合には、[変換 元]へフゔル パス(C:\shain2.txt)が表示されます。 [変換先]へは、[dbo].[shain2] と表示されますが、これは「SSISDB」データベース内へ 「shain2」という名前のテーブルを作成するという意味です(テーブルは実際にデータが転 送されるときに自動作成されます)。テーブル名は、ここで変更することもできますが、今回 は、「shain2」という名前のままにしておきます。 8. 続いて、[マッピングの編集]ボタンをクリックします。すると、次のように[列マッピング] 1 1
ダゕログが表示されて、作成されるテーブルの列名やデータ型などを変更できるようになり ます。 既定では、テキスト フゔルのデータは、varchar データ型として設定され、列名は、左側 から順に「列 0、列 1」と設定されます。今回は、変換先(ンポート先)の列名をわかりや すくするために、次のように「列 0」を「社員番号」へ、「列 1」を「氏名」へ、「列 2」を「給 与」へ変更します 「列 3」と「列 4」は、「<無視>」を選択して、コピー対象から外すようにします。このダ ゕログでは、データ型やサズなども変更できますが、今回は、このままで[OK]ボタンを クリックします。 9. [コピー元のテーブルおよびビューを選択]画面へ戻ったら、[次へ]ボタンをクリックしま [マッピングの編集]をクリックした場 合はコピーしない列を設定したりできる。 CSV フゔルの列数とテーブルの列数が 異なる場合に役立つ 1 2
す。 10. 次の[パッケージの保存および実行]画面では、[すぐに実行する]をチェックして、[次へ] ボタンをクリックします。 11. 最後の[ウゖザードの完了]画面で[完了]ボタンをクリックすると、データのエクスポート が開始されます。 1 [すぐに実行する]を選択 1 2
12. ンポートが完了すると、[操作は正常に実行されました]画面が表示されます。[状態]が「成 功」と表示されていることを確認して、[閉じる]ボタンをクリックします。
インポートされたデータの確認
13. ウゖザードでンポートしたデータを確認するには、Management Studio のオブジェクト エクスプローラで[データベース]フォルダを右クリックして、[最新の情報に更新]をクリ ックします。「SSISDB」データベースが表示されたら、次のように[テーブル]フォルダを 展開して、「shain2」という名前のテーブルを表示します。 [完了]をクリック 1 114. 続いて、「shain2」テーブルを右クリックして[上位 1000 行の選択]をクリックします。 これにより、shain2 テーブルのデータ(最初の 1000 件)が表示されます。社員番号と氏 名、給与がコピーされて、入社日と部門番号がコピーされていないことを確認できます。 このように、Integration Services では、ンポート元の CSV フゔルの列数とテーブル の列数が異なる場合にも、簡単にコピーすることができます(前の Step で利用した bcp コ マンドで同じことを実現しようとすると、フォーマット フゔルを作成しなければなりませ ん)。 1 1 「shain2」のデータが 表示される 2
3.4 Access データベース(.mdb)のインポート
Access データベースのインポート
Integration Services を利用すると、Access データベース(.mdb ファイル)も簡単にンポ ートできるようになります。
Let's Try
それでは、これを試してみましょう。ここでは、Microsoft Access 2003 に付属の Northwind (ノース ウンド)サンプル データベースを SQL Server へンポートしてみましょう。 Northwind データベースは、販売管理を題材としたサンプル データベースで、次のように商品に 関する受注情報が格納されています。
なお、このデータベースは、Access の既定のンストールでは、ンストールされていません。 ンストールするには、次のようにプログラムの追加と削除から行います。
以降の手順を試すには、この Northwind データベース(Northwind.mdb)が必要になります が、ほかの .mdb フゔルや Access 97 / 2000 に付属のデータベースでもほとんど同じように 試せるので、Northwind がない場合は、任意の .mdb フゔルで試してみてください。
インポート / エクスポート ウィザードの起動
1. まずは、次のように Management Studio で「SSISDB」データベースを右クリックして、 [タスク]メニューの[データのインポート]をクリックします。
2
3 1
2. ンポート / エクスポート ウゖザードが起動したら、[次へ]ボタンをクリックします。 3. 次の[データ ソースの選択]画面では、[データソース](コピー元となるデータベース)に 「Microsoft Access」を選択します。 続いて、[フゔル名]の[参照]ボタンをクリックして、[フゔルを開く]ダゕログを表 示します。 1 1 2
Northwind サンプル データベースが置いてある「C:\Program Files\Microsoft Office \OFFICE11\SAMPLES」フォルダを展開し、「Northwind.mdb」フゔルを選択して、[開 く]ボタンをクリックします。
4. [データソースの選択]画面へ戻ったら、[次へ]ボタンをクリックします。
Note: Access 2007 データベース(.accdb)を取り込みたい場合
Access 2007 のデータベース(.accdb フゔル)からデータを取り込みたい場合は、[データ ソース] で 「Microsoft Office 12.0 Access Database Engine OLE DB Provider」を選択する必要があります。このプ ロバダは、Microsoft Office 2007 のンストール時に自動でンストールされます。ンポート / エクスポー ト ウゖザードを実行しているマシンに Microsoft Office 2007 をンストールしていない場合は、下記のサトか ら「2007 Office system ドラバ」をダウンロードして、ンストールすることで、利用できるようになります。 2007 Office system ドラバ: データ接続コンポーネント http://www.microsoft.com/downloads/details.aspx?FamilyId=7554F536-8C28-4598-9B72-EF94E038C89 1&displaylang=ja 1 2 3 1
今回利用している .mdb フゔルのように Access 2003 以前のバージョンのデータベースの場合には、[データ ソース] へ「Microsoft Access」を選択すれば大丈夫です。 5. 次の[変換先の選択]画面では、変換先(コピー先)の設定を行います。 今回は、事前に「SSISDB」データベースを選択してウゖザードを起動しているので、[デー タベース]へ「SSISDB」が選択されています。 ここでは、このまま[次へ]ボタンをクリックして、SSISDB データベースへデータをン ポートします。 1 2 3
Microsoft Office 12.0 Access Database Engine OLE DB Provider を利用して Access 2007 の .accdb へ接続している例
1
6. 次の[テーブルのコピーまたはクエリの指定]画面では、[1 つ以上のテーブルまたはビュー からデータをコピーする]を選択して、[次へ]ボタンをクリックします。 7. 次の、[コピー元のテーブルおよびビューを選択]画面では、Access データベース内のテー ブルが一覧されます。今回は、「仕入先」と「社員」、「受注」、「受注明細」、「商品」、「商品区 分」、「得意先」の 7 つのテーブルをチェックして、ンポート対象に設定します。 設定後、[次へ]ボタンをクリックします。 1 2 1 2
8. 次の[パッケージの保存および実行]画面では、[すぐに実行する]をチェックして、[次へ] ボタンをクリックします。このデータのコピーをすぐに実行するか、後から実行するために保 存するかを選択します。 9. 最後の[ウゖザードの完了]画面で[完了]ボタンをクリックすると、データのエクスポート が開始されます。 10. ンポートが完了すると、次のように[操作は正常に実行されました]画面が表示されます。 [状態]が「成功」と表示されていることを確認して、[閉じる]ボタンをクリックします。 1 2 1
インポートされたデータの確認
11. ンポートしたデータを確認するには、Management Studio のオブジェクト エクスプロー ラで「SSISDB]データベースを展開して、[テーブル]フォルダを右クリックして、[最新の 情報に更新]をクリックします。これにより、ンポートした 7 つのテーブル(仕入先、社 員、受注、受注明細、商品、商品区分、得意先)が表示されるようになります 12. 次に、「社員」テーブルや「商品」テーブルを右クリックして、[上位 1000 行の選択]をク リックし、テーブルの中身を確認しておきましょう。 1 1「社員」テーブルのデータの確認 「商品」テーブルのデータの確認 1 2 1 2
Note: Access 側で設定された主キーやリレーション シップは転送されない
Integration Services では、Access データベース側で設定された主キーやリレーション シップなどの制約は転 送されません。Access 側で設定されていたリレーション シップは、次のとおりです。
Integration Services で取り込んだデータを Management Studio で確認すると、次のようになります。
[キー] フォルダや [制約] フォルダを参照しても、制約が作成されていないことから、制約が転送されていないこ とを確認できます。したがって、主キーやリレーション シップなどは、データの転送後に手動で設定する必要が あります。 社員テーブルの列の一覧。 主キーと外部キーには鍵のゕ コンが付くが、設定されて いない 主キーと外部キーが一覧され る場所。ここに存在しないこ とからも主キーと外部キーが 設定されていないことを確認 できる 制約が一覧される 場所(ココも空)
3.5 OPENROWSET による外部データのクエリ
OPENROWSET 関数とは
SQL Server では、OPENROWSET という関数を利用すると、Access データベースやリモート の SQL Server など、さまざまなデータベースのデータを SELECT ステートメントでクエリで きるようになります。この機能は、「アドホック クエリ」(Adhoc Query)とも呼ばれています。 OPENROWSET 関数は、次のように利用します。 SELECT * FROM OPENROWSET('プロバイダ名', 'プロバイダに応じた接続パス', 'SELECT ステートメント')
アドホック クエリの有効化
OPENROWSET 関数を利用するには、次のようにゕドホック クエリを有効化しておく必要があり ます(ゕドホック クエリは、悪意のある攻撃者からの思わぬ侵入経路となりかねないので、デフ ォルトでは禁止に設定されているからです)。EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'Ad Hoc Distributed Queries', 1
RECONFIGURE
また、OPENROWSET による操作が完了した後は、次のようにゕドホック クエリを無効化してお くようにしましょう。
EXEC sp_configure 'Ad Hoc Distributed Queries', 0
EXEC sp_configure 'show advanced options', 0
RECONFIGURE
リモートの SQL Server 2008 へ接続する場合
OPENROWSET 関数を利用して、リモートの SQL Server 2008 のデータをクエリする場合には、 次のように記述します。 SELECT * FROM OPENROWSET('SQLNCLI10' , 'Server=POWER;Trusted_Connection=yes;' , 'SELECT * FROM sampleDB.dbo.社員' )第 1 引数の「SQLNCLI10」は、SQL Server Native Client 10.0 を利用するという意味で、第 2 引数では、「Server=」に続けて、接続したい SQL Server の名前を指定しています。また、「;」 (セミコロン)を記述して、「;Trusted_Connection=yes;」と記述することで、Windows 認 証での接続を試みることができます(セミコロンの部分を、カンマにしないように注意してくださ い)。第 3 引数には、リモートの SQL Server 2008 で実行したい SELELCT ステートメントを記 述します。 このように、OPENROWSET 関数を利用すると、リモート(外部データ)を簡単にクエリするこ とができます。また、OPENROWSET で取得した結果に対して、Step2 で説明した SELECT .. INTO を利用すれば、結果をもとにテーブルを作成することもできます。
Access データベース(.mdb)をクエリする場合
OPENROWSET では、Access のデータベース(.mdb)をクエリすることもできます。これは、 次のように利用します(Access 2000/2003 データベースへ接続する場合)。 SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'' , 'SELECT * FROM 社員')
ースへのパスを記述しています)。パスに続けて、「;」(セミコロン)を記述し、「;'admin';''」と 指定します(これは Access に接続するためのユーザー名とパスワードの指定ですが、デフォル トでは admin/パスワードなしで接続できます。また、セミコロンの部分は、カンマにしないよ うに注意してください)。第 3 引数には、"SELECT * FROM 社員" のように Access データベー スに対して実行したい任意の SELECT ステートメントを記述できます。
Excel データをクエリ
OPENROWSET 関数では、Excel データ(.xls ファイル)をクエリすることもできます。これは、 次のように利用します(Excel 2003 データの場合)。 SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\Shohin.xls;' , 'SELECT * FROM [Sheet1$]')Excel 2003 へ接続する場合は、第 1 引数へ Access のときと同様「Microsoft.Jet.OLEDB 4.0」 を指定し、第 2 引数には、「Excel 8.0;Database=C:\Shohin.xls;」のように記述します。Excel 8.0 と指定することで、Excel データであることを指定し、Database= に続けて、.xls フゔ ルへのパスを記述します。第 3 引数には、"SELECT * FROM [Sheet1$]" のように記述し、シ ート名に「$」マークを付けて、大カッコ [ ] で囲みます。 このように、OPENROWSET 関数を利用すると、Excel データも簡単にクエリすることができま す。なお、クエリする Excel フゔルが、Excel によって開かれている場合は、エラーになるの で、必ず Excel を終了してから、このクエリを実行するようにします。
Oracle データベースをクエリ
OPENROWSET 関数では、Oracle データベースをクエリすることもできます。これは、次のよう に利用します(Oracle 9i データベースの場合)。 SELECT * FROM OPENROWSET('MSDAORA','ORCL';'SCOTT';'tiger' , 'SELECT * FROM EMP')
Oracle 9i データベースへ接続する場合は、第 1 引数へ「MSDAORA」を指定し、第 2 引数には、 「'ORCL';'SCOTT';'tiger'」のように、ネット サービス名、ユーザー名、パスワードの順に記述 します。第 3 引数には、"SELECT * FROM EMP" のように Oracle Server に対して実行したい 任意の SELECT ステートメントを記述できます。なお、Oracle データベースへ接続するには、 事前に「Oracle Provider for OLE DB」をンストールして、ネット サービス名を設定してお く必要があります。
このように、OPENROWSET 関数を利用すると、Oracle データベースも簡単にクエリできるよう になります。
3.6 OPENROWSET .. BULK によるテキスト ファイルのインポート
OPENROWSET .. BULK でテキスト ファイルを一括インポート
OPENROWSET 関数では、テキスト フゔルを一括ンポートする機能もあります。これは、次 のように利用します。 SELECT * FROM OPENROWSET( BULK 'テキスト ファイル名' ,FORMATFILE = 'フォーマット ファイル名' ) 別名 OPENROWSET での一括ンポートでは、フォーマット ファイルを別途作成する必要があります。 このフゔルは、bcp コマンドや BULK INSERT というステートメントで利用できるものと同 じ形式なのですが、ンポート先の列名や列数と、テキスト フゔル内の列数や区切り文字など を対応付けするためフゔルです。これは、次のような形式をとります。フォーマット ファイルの自動生成: bcp コマンド
bcp コマンドには、既存のテーブルをもとに、フォーマット フゔルを自動生成してくれる機能 があります。たとえば、次のようにンポート先のテーブルがあるとします。 -- インポート先のテーブル USE sampleDB CREATE TABLE t1 ( a int ,b char(10 ) ) この場合に、bcp コマンドをコマンド プロンプトから次のように実行すると、フォーマット フゔ ルを自動生成してくれます。bcp sampleDB.dbo.t1 format nul -T -c -t "," -f C:\test.fmt
自動生成されたフォーマット フゔル(カンマ区切りの CSV フゔル用)
プションは、同じ意味で、-T で Windows 認証、-c -t "," でカンマ区切りのテキスト フゔル 形式であることを指定しています。-f オプションでは、生成したいフォーマット フゔルの名前 を任意で指定できます(拡張子を .fmt とするのが慣習です)。
OPENROWSET .. BULK での一括インポート
次に、OPENROWSET 関数でテキスト フゔルを一括ンポートしてみましょう。次のテキスト フゔル(カンマ区切り)を t1 テーブルへ一括ンポートするとします。 このフゔルが「C:\bulkTest1.csv」の場合は、OPENROWSET 関数を次のように記述します。 SELECT * FROMOPENROWSET( BULK 'C:\bulkTest1.csv'
,FORMATFILE = 'C:\test.fmt' ) b
これを、次のように INSERT .. SELECT で利用すれば、t1 テーブルへ一括ンポートできるよ うになります。
INSERT INTO t1
SELECT * FROM
OPENROWSET( BULK 'C:\bulkTest1.csv'
MERGE ステートメントと OPENROWSET .. BULK の連携
OPENROWSET .. BULK は、SQL Server 2008 からの新機能である「MERGE」ステートメント と連携して機能させることができます。MERGE ステートメントは、データが存在する場合には UPDATE を、存在しない場合には INSERT 処理が行える非常に便利ステートメントです(詳し くは、本自習書シリーズの「Transact-SQL 応用」で説明しています)。
したがって、MERGE ステートメントと OPENROWSET .. BULK を組み合わせると、一括ンポ ート時に、データが既に存在する場合には UPDATE を、存在しない場合には INSERT 処理が行 えるようになります。
たとえば、ンポートしたいフゔルが、次の「C:\bulkTest2.csv」だとします。
この場合は、次のように実行することができます。
MERGE INTO t1
USING OPENROWSET( BULK 'C:\bulkTest2.csv'
,FORMATFILE = 'C:\test.fmt' ) bulk1 ON t1.a = bulk1.a
WHEN MATCHED THEN
UPDATE SET t1.b = bulk1.b
WHEN NOT MATCHED THEN
INSERT VALUES ( bulk1.a, bulk1.b );
このように OPENROWSET 関数は、テキスト フゔルを一括ンポートするシナリオでも大変 役立ちます。 t1 テーブル C:¥bulkTest2.csv フゔル UPDATE されたデータ INSERT されたデータ MERGE
3.7 リンク サーバーによる外部データのクエリ
リンク サーバー
OPENROWSET 関数では、毎回クエリの実行時にプロバダ名や接続パスを記述する必要がある ので、何度もクエリを実行する場合には面倒です。これを解決してくれる機能が「リンク サーバ ー」です。リンク サーバーを利用すると、何度もゕクセスするリモート データ(接続先)に対し て、名前を付けて保存しておくことができます。Let's Try
それでは、これを試してみましょう。ここでは、Access 2003 データベースの Northwind サン プル データベース(Northwind.mdb)に対して、リンク サーバーを作成する手順を試してみ ましょう。 1. リンク サーバーを作成するには、まず Management Studio のオブジェクト エクスプロー ラで[サーバー オブジェクト]を展開し、[リンク サーバー]フォルダを右クリックして[新 しいリンク サーバー]をクリックします。 これにより、[新しいリンク サーバー]ダゕログが表示されるので、[リンク サーバー]へ 任意の名前(今回は、NW)を入力します。 次に、[サーバーの種類]で「その他のデータ ソース」を選択して、[プロバダ]で 1 1 2「Microsoft.Jet 4.0 OLEDB Provider」を選択します。[製品名]へは、任意の文字(ここ では Access 2003)を入力し、[データソース]へ Access データベース(.mdb フゔル) へのパスを入力します(ここでは、C:\Program Files\Microsoft Office\OFFICE11\ SAMPLES\Northwind.mdb)。
設定後、[OK]ボタンをクリックすれば、リンク サーバーの作成が完了です。
Note: [製品名]や[プロバイダ文字列]の設定
リンク サーバーの設定画面の、データソースに対する[プロバイダ]や[製品名](product_name)、[プロバイ
ダ文字列](provider_string)については、SQL Server オンラン ブックの Transact-SQL リフゔレンスにあ
る「sp_addlikedserver」で詳しく解説されています。 2. 作成したリンク サーバーを次のように展開すると、Access データベース内のテーブルの一 覧を参照することができます。 1 プロバダ名 や製品名 1
3. 次に、作成したリンク サーバー「NW」を利用して、「社員」テーブルのデータを参照してみ ましょう。 SELECT * FROM NW...社員 リンクサーバーでは、「リンクサーバー名.データベース名.スキーマ名.テーブル名」という構 文でテーブルへゕクセスできますが、Access の場合は、リンクサーバー自体がデータベース なので、データベース名を省略しています。また、Access にはスキーマも存在しないので、 これも省略して、「NW...社員」と記述しています。 このようにリンク サーバー機能を利用すると、OPENROWSET 関数のように、毎回プロバ ダを指定したり、接続パスを欠かなくて済むようになるので、大変便利です。 Note: コマンドでリンクサーバーを作成する: sp_addlinkedserver リンクサーバーは、sp_addlinkedserver システム ストゕド プロシージャを利用して、コマンドで作成すること も可能です。これは、次のように利用します。
EXEC master..sp_addlinkedserver
@server = N'NW'
, @srvproduct=N'Access 2003'
, @provider=N'Microsoft.Jet.OLEDB.4.0'
, @datasrc=N'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb' ■ スクリプト生成機能 GUI ベースで作成したリンクサーバーは、次のようにスクリプト生成機能を利用して、sp_addlinkedserver を自 動生成できるので、便利です。 1 sp_addlinkedserver が自動生成される 2
リモート SQL Server に対してリンク サーバーを作成する場合
リモートの SQL Server に対してリンク サーバーを作成する場合は、次のように操作します。 1. まず、Management Studio で[リンク サーバー]フォルダを右クリックして[新しいリン ク サーバー]をクリックします。 2. [新しいリンク サーバー]ダゕログが表示されたら、[サーバーの種類]で「SQL Server」 を選択し、[リンク サーバー]へ接続先の SQL Server のインスタンス名を入力します。 3. 次に、[ページの選択]で「セキュリティ」をクリックして、[セキュリテゖ]ページを開き、 任意の接続方法を選択します。 1 SQL Server の 名前を記述 2 1 1 2 3画面のように「ログインの現在のセキュリティ コンテキストを使用する」をチェックした場 合は、現在ログンしているユーザー情報を利用して、リモートの SQL Server へのログ ンを試みるようになります。設定後、[OK]ボタンをクリックすれば、リンク サーバーの作 成が完了です 4. リンクサーバー作成後は、設定した SQL Server 上のデータベースの一覧やテーブルを参照 できるようになります。 クエリを実行するときの構文は、前述したように「リンクサーバー名.データベース名.スキー マ名.テーブル名」と 4 つの名前を指定します(画面は、POWER という名前の SQL Server の sampleDB データベース、dbo スキーマ内の「社員」テーブルをクエリしています)。 リモート SQL Server の データベースやテーブルを 一覧できる 1 リンクサーバーを利用した クエリ実行 2