この文章に含まれる情報は 公表の日付の時点での Microsoft Corporation の考え方を表しています 市場の変化に応える必要 があるため Microsoft は記載されている内容を約束しているわけではありません この文書の内容は印刷後も正しいとは保障で きません この文章は情報の提供の

Similar documents
SQL Server 2008 自習書シリーズ No.3 データのコピーと現場で役立つ便利な操作集 Published: 2008 年 4 月 30 日 改訂版 : 2008 年 11 月 30 日 有限会社エスキューエル クオリテゖ

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

目次 目次 準備いただくもの 準備 SQLServer2008 R2 ExpressEdition のインストール インストールの前に インストール 設定一覧 機

改版履歴 版数 改版日付 改版内容 /03/14 新規作成 2013/03まで製品サイトで公開していた WebSAM DeploymentManager Ver6.1 SQL Server 2012 製品版のデータベース構築手順書 ( 第 1 版 ) を本 書に統合しました 2

RICOH Device Manager Pro バックアップ/バージョンアップ作業手順書

手順書

アーカイブ機能インストールマニュアル

eYACHO 管理者ガイド

アーカイブ機能インストールマニュアル

産直くん 9 リピートくん 9 バックアップ リストア作業チェックリスト バックアップ リストア作業項目一覧 作業項目作業目安時間概要 00 バックアップ リストア作業を行う前に 産直くん 9 リピートくん 9 のバックアップ リストア作業を円滑に行うための確認事項をまとめています 1. バックアッ

目次 目次... 2 はじめに SQL Server 2005 製品版へのアップグレード SQL Server 2005 製品版へのデータベース (DPM インスタンス ) の構築 / 設定 データベース (DPM インスタンス ) の構築

スライド 1

ER/Studio Data Architect 2016 の新機能

Active Directory フェデレーションサービスとの認証連携

MxLogonサーバサイドツールキット用UI

PowerPoint プレゼンテーション

目次 専用アプリケーションをインストールする 1 アカウントを設定する 5 Windows クライアントから利用できる機能の紹介 7 1ファイル フォルダのアップロードとダウンロード 8 2ファイル更新履歴の管理 10 3 操作履歴の確認 12 4アクセスチケットの生成 ( フォルダ / ファイルの


目 次 1. はじめに ソフトの起動と終了 環境設定 発助 SMS ファイルの操作 電話番号設定 運用条件 回線情報 SMS 送信の開始と停止 ファイル出力... 16

目次 レジストリの設定...2 トレーディングソフトの自動起動設定...7 VPS 自動再起動の設定

Microsoft Word - Custom1_ABC伝票印刷ドライバー_導入ガイド

Master'sONEセキュアモバイル定額通信サービス(MF120)設定手順書(Ver1_2).doc

目次 第 1 章概要....1 第 2 章インストールの前に... 2 第 3 章 Windows OS でのインストール...2 第 4 章 Windows OS でのアプリケーション設定 TP-LINK USB プリンターコントローラーを起動 / 終了するには

動作環境 対応 LAN DISK ( 設定復元に対応 ) HDL-H シリーズ HDL-X シリーズ HDL-AA シリーズ HDL-XV シリーズ (HDL-XVLP シリーズを含む ) HDL-XV/2D シリーズ HDL-XR シリーズ HDL-XR/2D シリーズ HDL-XR2U シリーズ

SCC(IPsec_win10)_リモート設定手順書.doc

PowerPoint Presentation

Microsoft Word - …x…W…t…‰…l…b…g…Z…b…g…A…b…v”è‘⁄‘‚_Ver5_.docx

1 はじめに 前準備 MICROSOFT 製品のプログラムを最新の状態にする NET FRAMEWORK 4.0 ( と日本語 LANGUAGE PACK) のインストール NET FRAMEWORK 4.0 のインストール... 4

年調・法定調書の達人from弥生給与(Ver 以降) 運用ガイド

ユーザズサイトのオフライン用検出エンジン( ウイルス定義データベース)を利用したオフライン更新手順書(バージョン 7 向け)

Master'sONEセキュアモバイル定額通信サービス(MF120)設定手順書(Ver1_2).doc

ActiveImage Protector 2016 R2 for Express5800 / ftサーバ

GHS混合物分類判定システムインストールマニュアル

PrintBarrierV3L50(V ) アップデート手順書 第 1.01 版 株式会社富士通アドバンストエンジニアリング 平成 25 年 3 月 7 日 1

インテル(R) Visual Fortran コンパイラ 10.0

クライアント証明書導入マニュアル

SMB送信機能

DBMSリポジトリへの移行マニュアル

Word2010基礎

SMB送信機能

年調・法定調書の達人from弥生給与 運用ガイド

各種パスワードについて マイナンバー管理票では 3 種のパスワードを使用します (1) 読み取りパスワード Excel 機能の読み取りパスワードです 任意に設定可能です (2) 管理者パスワード マイナンバー管理表 の管理者のパスワードです 管理者パスワード はパスワードの流出を防ぐ目的で この操作

Master'sONEセキュアモバイル定額通信サービス(MF120)設定手順書(Ver1_2).doc

「Microsoft

DrSumEA_ServerC_本文.indd

かぐや3Dムーンナビ起動障害対応手順書_

Manager編

MOS_Windows8

内容 1 はじめに インストールの手順 起動の手順 Enterprise Architect のプロジェクトファイルを開く 内容を参照する プロジェクトブラウザを利用する ダイアグラムを開く 便利な機能.

8. 適用 を後 OK をしウインドウを閉じてください 2. パソコンと LCV3 を LAN ケーブルで接続し 設定を行います Windows パソコンの推奨環境は以下の通りです (2015 年 6 月現在 ) OS : Windows XP Vista 7 8 CPU : 32bit 64bit

一般社団法人ビジネス機械・情報システム産業協会

1. アンケート集計サンプルについて ここでは Windows Azure と SQL Azure を使ってアンケートを実施し アンケート結果を Excel で集計するサンプルについて説明します アンケートは Windows Azure で運用し アンケート結果は SQL Azure に格納されます

ご注意 1) 本書の内容 およびプログラムの一部 または全部を当社に無断で転載 複製することは禁止されております 2) 本書 およびプログラムに関して将来予告なしに変更することがあります 3) プログラムの機能向上のため 本書の内容と実際の画面 操作が異なってしまう可能性があります この場合には 実

スライド 1

PowerPoint Presentation

ことばを覚える

PALNETSC0184_操作編(1-基本)

SetupVerup_dl_M

セキュリティ設定ツールインストール 桐セキュリティ設定ツールインストール C: K3 KIRIV9 Security フォルダ内 KISECURE をダブルクリックして設定を開始します 初回セキュリティ設定ツールを起動時はウィザート形式で設定します メッセージにしたがって初期設定を行ってください セ


CS-DRC1操作説明書

共有フォルダ接続手順 1 共有フォルダ接続ツールのダウンロード 展開 CSVEX のトップページから共有フォルダ接続ツールの zip ファイルをダウンロードします ダウンロードした zip ファイルを右クリックして すべて展開 を選択します (Windows 環境では zip ファイルを解凍しなくて

SQL Server 2005 自習書管理編 No.6 1 SQL Server 2005 自習書シリーズ管理編 No.6 アップグレード 移行

P-touch Transfer Manager の使用方法 ご使用になる前に 必ず本書をお読みください 本書はお読みになったあとも いつでも手にとって参照できるようにしてください Version 0 JPN

データベースアクセス

ご存知ですか? データ転送

JDL Webストレージサービス はじめにお読みください

OneDrive-Oneline_2013

OTRS10 他社システムOTRS呼出利用手順書

10 完了 をクリック 13 このサーバーは認証が必要 をチェックして 設定 をクリック Windows メール Windows Vista に標準のメールソフト Windows メール の設定方法を説明します 1 スタート から 電子メール Windows メール をクリック 11 続いて設定ファ

CLUSTERPRO MC StorageSaver for BootDisk 2.1 (for Windows) インストールガイド 2016(Mar) NEC Corporation はじめに 製品導入の事前準備 本製品のインストール 本製品の初期設定 本製品のアンインストール

Microsoft Word JA_revH.doc

V-CUBE One

32 ビット版 64 ビット版 Microsoft Windows XP Professional Microsoft Windows XP Professional x64 * * SP2 および SP3 Edition SP2 Microsoft Windows XP Home SP2 お *

WES7シンクライアントIE11アップデート手順書

カードプリンターImageCreateDBL 簡単操作ガイド(Accessデータ差し込み編)

Microsoft Word - 【重要】ASM200_V4.10バージョンアップ手順rev2.docx

Pirates Buster Series Secure Viewer セットアップマニュアル (Web インストーラ)

SMB送信機能

Microsoft Word - SSI_Smart-Trading_QA_ja_ doc

Transcription:

SQL Server 202 自習書シリーズ No.3 データのコピーと現場で役立つ便利な操作集 Published: 2008 年 4 月 30 日 SQL Server 202 更新版 : 202 年 8 月 7 日有限会社エスキューエル クオリティ

この文章に含まれる情報は 公表の日付の時点での Microsoft Corporation の考え方を表しています 市場の変化に応える必要 があるため Microsoft は記載されている内容を約束しているわけではありません この文書の内容は印刷後も正しいとは保障で きません この文章は情報の提供のみを目的としています Microsoft SQL Server Visual Studio Windows Windows XP Windows Server Windows Vista は Microsoft Corporation の米国およびその他の国における登録商標です その他 記載されている会社名および製品名は 各社の商標または登録商標です Copyright 202 Microsoft Corporation. All rights reserved. 2

目次 STEP. 自習書を試す環境について... 4. この自習書の内容について... 5.2 自習書を試す環境について... 6.3 事前作業 ( サンプルスクリプトのダウンロードとセットアップ )... 7 STEP 2. データのコピーとエクスポート... 9 2. テーブルをコピーする : SELECT.. INTO... 0 2.2 データをコピーする : INSERT.. SELECT... 5 2.3 クエリエディターで CSV 形式の結果を出力する... 7 2.4 bcp コマンドで CSV ファイル出力 ( エクスポート )... 20 2.5 bcp コマンドで CSV ファイル入力 ( インポート )... 23 STEP 3. Integration Services によるエクスポートとインポート... 25 3. Integration Services の概要... 26 3.2 Integration Services による CSV ファイルへのエクスポート... 29 3.3 Integration Services による CSV ファイルのインポート... 35 3.4 Access データベース (.accdb/.mdb) のインポート... 44 3.5 OPENROWSET による外部データのクエリ... 55 3.6 OPENROWSET.. BULK によるテキストファイルのインポート... 6 3.7 リンクサーバーによる外部データのクエリ... 64 STEP 4. テーブル関連の便利な操作... 70 4. 自動的に連続番号を振る : IDENTITY プロパティ... 7 4.2 データの全削除を高速に実行する : TRUNCATE TABLE... 78 4.3 列に既定値を設定する : DEFAULT 値... 79 3

STEP. 自習書を試す環境について この STEP では この自習書で取り扱う内容と 自習書を試す環境について説明 します この STEP では 次のことを学習します この自習書の内容について 自習書を試す環境について 事前作業 ( サンプルスクリプトのダウンロードとセットアップ ) 4

. この自習書の内容について この自習書の内容について この自習書では データやテーブルを単純にコピーする方法や 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 間でデータベースを移動するシナリオ ( 開発機から本番機 あるいはその逆へ データベースを移動する方法 ) については 本自習書シリーズの バックアップと復元 編で 詳 しく説明していますので こちらもぜひご覧いただければと思います 5

.2 自習書を試す環境について 必要な環境 この自習書で実習を行うために必要な環境は次のとおりです OS Windows Server 2008 SP2 以降または Windows Server 2008 R2 SP 以降または Windows Server 202 または Windows Vista SP2 以降または Windows 7 SP 以降または Windows 8 ソフトウェア SQL Server 202 この自習書内での画面やテキストは OS に Windows Server 2008 R2(x64) ソフトウェアに SQL Server 202 Enterprise エディション (x64) を利用して記述しています そのほか この自習書を試すには サンプルスクリプトをダウンロードして 次のページの事前作業を実行しておく必要があります 6

.3 事前作業 ( サンプルスクリプトのダウンロードとセットアップ ) 事前作業 この自習書を進めるには サンプルスクリプトをダウンロードしておく必要があります また Management Studio のクエリエディターを利用して サンプルスクリプト内にある CreateTables.txt を実行し sampledb データベースと 社員 テーブルを作成しておく必要があります ( 実行手順は 次のとおりです ). まずは Management Studio を起動するために [ スタート ] メニューの [ すべてのプログラム ] から [Microsoft SQL Server 202] を選択して [SQL Server Management Studio] をクリックします 2. 起動後 次のように [ サーバーへの接続 ] ダイアログが表示されたら [ サーバー名 ] へ SQL Server の名前を入力し [ 接続 ] ボタンをクリックします SQL Server の名前を入力 2 [ 接続 ] ボタンをクリック 3. 接続完了後 Management Studio が開いたら 次のようにツールバーの [ 新しいクエリ ] ボタンをクリックして クエリエディターを開きます 7

新しいクエリ をクリック クエリエディターが表示される 4. 次に Windows エクスプローラーを起動して サンプルスクリプトをダウンロードしたフ ォルダーを展開し このフォルダー内の CreateTables.txt ファイルをダブルクリックし て開きます ファイルの内容をすべてコピーして クエリエディターへ貼り付けます 2 サンプルスクリプト内の CreateTables.txt ファイルの内容をコピーして貼り付け 3 結果を確認 貼り付け後 ツールバーの [! 実行 ] ボタンをクリックしてクエリを実行します これにより sampledb という名前のデータベースが作成され その中へ 社員 テーブルが作成さ れます 実行後 社員 テーブルの 6 件のデータが表示されれば 実行が完了です 8

STEP 2. データのコピーとエクスポート この STEP では SELECT ステートメントで取得した結果をもとに 新しくテー ブルを作成したり 別のテーブルへコピーしたり CSV ファイル形式へエクスポ ートする方法について説明します この STEP では 次のことを学習します テーブルをコピーする : SELECT.. INTO データをコピーする : INSERT.. SELECT クエリエディターで CSV 形式の結果を出力する bcp コマンドで CSV ファイルへの出力 ( エクスポート ) bcp コマンドで CSV ファイルからの入力 ( インポート ) 9

2. テーブルをコピーする : SELECT.. INTO SELECT.. INTO SQL Server では SELECT.. INTO(SELECT ステートメントで INTO 句 ) を利用すると SELECT ステートメントで取得した結果をもとにテーブルを作成することができます これは 次のように記述します SELECT * INTO 新しいテーブル名 FROM テーブル名 Let's Try それでは これを試してみましょう. まずは [ スタート ] メニューの [ すべてのプログラム ] から [Microsoft SQL Server 202] の [SQL Server Management Studio] をクリックして Management Studio を起動します 2. [ サーバーへの接続 ] ダイアログでは [ サーバー名 ] へ SQL Server の名前を入力します 2 0

[ 認証 ] では Windows 認証 を選択して [ 接続 ] ボタンをクリックします ( 認証については 本自習書シリーズの ログイン認証とオブジェクト権限 で詳しく説明していますので こちらもぜひご覧いただければと思います ) 3. Management Studio が起動したら 次のようにツールバーの [ 新しいクエリ ] ボタンをクリックして [ クエリエディター ] を開きます 新しいクエリ をクリック クエリエディターが表示される 4. クエリエディターでは 次のように入力して sampledb データベースへ接続し 社員 テーブルのデータを参照します USE sampledb SELECT * FROM 社員 2 [! 実行 ] をクリック sampledb データベースへ接続 SQL を記述 社員テーブルを検索 3 社員テーブルの中身が表示される 社員 テーブルのデータ (6 件 ) を取得できたことを確認できます 5. 次に SELECT.. INTO を利用して 社員 テーブルのデータをもとに 新しく 社員コピ ー テーブルを作成してみましょう USE sampledb SELECT * INTO 社員コピー FROM 社員

6 行処理されました と表示されれば 正しくデータのコピーが完了しています このように 通常の SELECT ステートメントへ "INTO 新しいテーブル名 " を追加するだけで SELECT ステートメントで取得した結果をもとに INTO 句で指定したテーブルを作成できるようになります 6. コピーした 社員コピー テーブルのデータを確認しておきましょう SELECT * FROM 社員コピー 社員 テーブルのデータが すべてコピーされていることを確認できます 7. 次に 作成した 社員コピー テーブルの定義を確認してみましょう オブジェクトエクスプローラーで sampledb データベースの [ テーブル ] フォルダーを展開して 社員コピー テーブルが表示されることを確認します ( 表示されない場合は sampledb データベースの [ テーブル ] フォルダーを右クリックして [ 最新の情報に更新 ] をクリックします ) 社員コピー テーブルが表示されたら これを展開して 列名やデータ型 NULL を許可す るかどうかなどの定義が コピー元のテーブルと同じであることを確認できます 2

Note: SELECT.. INTO では制約はコピーされない SELECT.. INTO では 制約 ( 主キー制約や外部キー制約 CHECK 制約など ) をコピーすることはできません 制約をコピーしたい場合には 別途 次のようにスクリプト生成機能などを利用して コピー先で 制約を再作成する必要があります 制約のスクリプト生成制約のスクリプトを生成するには 次のようにテーブルを右クリックして [ テーブルをスクリプト化 ] から [CREATE] 新しいクエリエディターウィンドウ をクリックします これにより テーブルを作成するためのスクリプト (CREATE TABLE) が生成されて 合わせて 制約を作成す るためのスクリプト (ALTER TABLE.. CONSTRAINT) も生成されます なお 主キー制約は 次のように CREATE TABLE ステートメントの中へ生成されています 主キー制約 (PRIMARY KEY) もスクリプト化されている 3

データをコピーせずにテーブル定義のみをコピーする 次に SELECT.. INTO を利用して テーブル定義のみをコピーしてみましょう. 前の手順と同じように SELECT.. INTO を利用して 社員 テーブルのテーブル定義のみ をコピーした 社員コピー 2 という名前の新しいテーブルを作成してみましょう このとき WHERE 句の条件式へ 社員番号 = - を付けて実行するようにします SELECT * INTO 社員コピー 2 FROM 社員 WHERE 社員番号 = - 0 行処理されました と表示されるのがポイントです 社員 テーブルの中には 社員番号 が "-" のデータは存在しないので 0 件と表示されています これにより データは 件もコピーされずに テーブルの定義だけをコピーして 社員コピー 2 テーブルを作成することができています このように WHERE 句の条件式で 結果が 0 件になるように記述すると テーブル定義だけをコピーできるようになります なお WHERE 句の条件式へは "WHERE =2" のように 成り立たない条件式を記述した 場合にも 結果が 0 件になるので テーブル定義のみをコピーする目的として利用すること ができます 4

2.2 データをコピーする : INSERT.. SELECT INSERT.. SELECT 前述の SELECT.. INTOは データのコピーとともに 新しくテーブルを作成するので 既に存在するテーブルに対してデータをコピーする目的としては利用できません 既存のテーブルへデータをコピーしたい場合には INSERT.. SELECT を利用します これは 次のように利用します INSERT INTO テーブル名 SELECT ステートメント これにより SELECT ステートメントで取得した結果を INSERT INTO で指定したテーブルへコピーできるようになります Let's Try それでは これを試してみましょう. まずは sampledb データベース内へ 次のように emp という名前のテーブルを作成します USE sampledb CREATE TABLE emp ( empno int,empname char(50) ) 2. 次に INSERT.. SELECT を利用して 社員 テーブルの 社員番号 と 氏名 列を emp テーブルの empno と empname 列へ それぞれコピーしてみましょう INSERT INTO emp SELECT 社員番号, 氏名 FROM 社員 5

既存の emp テーブルへ 社員 テーブルの 社員番号 と 氏名 列のデータをコピー できたことを確認できます このように INSERT.. SELECT を利用すると 既存のテーブ ルへデータをコピーできるようになります Note: INSERT 先のテーブルの列数と SELECT ステートメントで取得する列数を同じにする INSERT.. SELECT では INSERT 先のテーブルの列数と SELECT ステートメントで取得する列数が異なる場合には エラーが発生します たとえば 次のように列数が異なる場合は エラーが発生して データのコピーに失敗します INSERT 先のテーブルの列数と SELECT ステートメントで取得する列数は 合わせるようにしましょう 6

2.3 クエリエディターで CSV 形式の結果を出力する クエリエディターで CSV 形式の結果を出力 Management Studio の クエリエディター では SELECT ステートメントで取得した結果を CSV 形式 ( カンマ区切りのテキスト形式 ) へ変換して出力することができます Let's Try それでは これを試してみましょう. まずは 次のようにクエリエディター上の任意の領域を右クリックして [ 結果の出力 ] の [ 結果をテキストで表示 ] をクリックします 右クリック 2 これで グリッド形式ではなく テキスト形式でクエリ結果を取得できるようになります 2. 続いて もう一度 クエリエディター上の任意の領域を右クリックして [ クエリオプショ ン ] をクリックします 右クリック 2 [ クエリオプション ] をクリック 7

3. これにより [ クエリオプション ] ダイアログが表示されるので 左ペインで [ 結果 ] を展開 して [ テキスト ] をクリックします 2 [ 出力形式 ] で [ コンマ区切り ] を選択 デフォルトは [ 固定列 ] [ テキスト ] を選択 3 次に 右ペインの [ 出力形式 ] で [ コンマ区切り ] を選択して [OK] ボタンをクリックしま す 以上で 設定が完了です 4. それでは 社員 テーブルのデータを参照してみましょう USE sampledb SELECT * FROM 社員 結果が カンマ区切りの CSV 形式で出力されたことを確認できます このように クエリエ ディターの出力形式を コンマ区切り へ設定すると SELECT ステートメントの実行結果 を CSV 形式で取得できるようになります Note: char 型の余分なスペースをトルには RTRIM 関数上の手順では 氏名 列のデータの右側へ余分なスペースが含まれています これは 氏名 列のデータ型を char(50) で定義しているためです この右側の余分なスペースを取り除くには RTRIM という関数を次のように利用します 8

RTRIM 関数については 本自習書シリーズの Transact-SQL 入門 で詳しく説明しています 5. 最後に デフォルトのグリッド形式で結果が出力されるように戻しておきましょう グリッド 形式へ戻すには 次のようにクエリエディター上の任意の領域を右クリックして [ 結果の出 力 ] の [ 結果をグリッドに表示 ] をクリックします 右クリック 2 9

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 認証で SQL Server へ接続 /c テキスト形式で出力 /t 列区切りを示す記号を指定, と記述した場合はカンマ区切り 省略時は Tab 区切り /S で SQL Server の名前を指定し /T で Windows 認証での接続 /c でテキスト形式での出力 /t "," でカンマ区切りを指定できます /T と /t は 異なるオプションなので ( 大文字と小文字が区別されるので ) 注意してください bcp コマンドは コマンドプロンプト ツールから実行する必要があります コマンドプロンプトは 次のように [ スタート ] メニューの [ すべてのプログラム ] [ アクセサリ ] から [ コマンドプロンプト ] をクリックして 起動することができます 20

Let's Try それでは これを試してみましょう. まずは [ スタート ] メニューからコマンドプロンプトを起動します 2. コマンドプロンプトが起動したら 次のように bcp コマンドを入力して 社員 テーブルのデータを C:\shain.txt ファイル(CSV 形式 ) へ出力してみましょう bcp sampledb.dbo. 社員 out C:\shain.txt /S Server /T /c /t "," bcp コマンドを入力後 [ENTER] キーを押す /S オプションに指定した "Server" は SQL Server の名前 ( インスタンス名 ) になるので 皆さんの環境に合わせて変更してください また テーブル名の指定は " データベース名. スキーマ名. テーブル名 " と記述する必要があることに注意してください ( スキーマについては 本自習書シリーズの ログイン認証とオブジェクト権限 で詳しく説明しています コマンドを実行後 " コピーを開始しています..." と表示されて その後 "n 行コピーされました " と表示されれば成功です Note: エラー ホストのデータファイルが開けません が出る場合は NTFS アクセス許可を付与 bcp のコマンドの実行時に 次のように ホストのデータファイルが開けません エラーが発生する場合は NTFS の書き込み権限がない場合に発生します NTFS アクセス許可を付与するか 別途アクセス許可のあるフォルダーを作成して (C:\temp など ) そこへ出力 するようにしてみてください 3. 次に Windows エクスプローラーを起動して C:\shain.txt ファイルが作成されてい ることを確認します 2

ダブルクリック 2 メモ帳で C: shain.txt ファイルを開いて 結果を確認 氏名 列は char 型なので余分な空白あり CSV 形式でファイルが作成されていることを確認できます Note: bcp は何の略? bcp は Bulk Copy の略です Bulk は 一括 / 大量 / バラ積み という意味なので bcp は " 一括コピープロ グラム " と呼ばれることもあります 22

2.5 bcp コマンドで CSV ファイル入力 ( インポート ) bcp コマンドで CSV ファイル入力 ( インポート ) bcp コマンドでは テキストファイルをインポートする機能もあります これは 次のように利 用します bcp テーブル名 in CSV ファイル名 /S SQL Server 名 /T /c /t ", " 出力するときとの違いは "out" を "in" へ変更しただけです Let's Try それでは これを試してみましょう. 前の step で出力した C:\shain.txt を Step 2.で作成した 社員コピー 2 テーブルへインポートしてみましょう コマンドプロンプトを起動して 次のように入力します bcp sampledb.dbo. 社員コピー 2 in C:\shain.txt /S Server /T /c /t "," コマンドの実行後 "n 行コピーされました " と表示されれば成功です 2. 次に クエリエディターを開いて 社員コピー 2 テーブルを参照して データが正しくインポートされているかどうかを確認しておきましょう USE sampledb SELECT * FROM 社員コピー 2 23

Note: bcp コマンドの注意点 bcp コマンドは 単純なデータのコピー用途としては便利ですが 複雑な処理を行うのには適していません たとえば インポート元の CSV ファイルの列数とテーブルの列数が異なる場合や データにカンマが含まれている場合には " フォーマットファイル " を作成しなければなりません ( データにカンマが含まれている場合は そのカンマが区切り文字として見なされないようにデータを二重引用符で囲むなどの対処が必要になります ) これらの問題は 次の Step で説明する Integration Services 機能を利用すると簡単に解決することができます 24

STEP 3. Integration Services による エクスポートとインポート この STEP では Integration Services のインポート / エクスポートウィザード を利用したデータのコピーや OPENROWSET リンクサーバーを利用した外部 データのクエリ方法について説明します この STEP では 次のことを学習します Integration Services の概要 CSV ファイルへのエクスポート CSV ファイルのインポート Access データベースのインポート OPENROWSET を利用した外部データのクエリリンクサーバーを利用した外部データのクエリ 25

3. Integration Services の概要 Integration Services の概要 SQL Server 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 データベースを SQL Server へ取り込むことが可能 26

SQL Server 202 自習書 No.3 現場で役立つ便利な操作集 Excel データを SQL Server へ取り込む インポートする Oracle データベースを SQL Server へ取り込む インポート エクスポート ウィザード Integration Services では これらのデータ転送は SQL Server インポートおよびエクスポー ト ウィザード 以下 インポート エクスポート ウィザード という機能によって ウィザー ド形式 対話形式 で指定された項目を入力 選択するだけで簡単に実行することができます 27

SSIS デザイナーによるデータ変換 Integration Services には 単純なデータコピーだけでなく 次のように データを変換 ( デー タを加工しながら転送 ) できる機能もあります データを変換して転送する 姓 と 名 を文字列連結して 氏名 へ変換 性別コード の を 男性 2 を 女性 へ変換 部門番号 を 部門名 へ変換 この機能は 非常に便利で データウェアハウス (DWH:Data Warehouse) を構築する際には 欠かせないツールとなります このようなデータ変換は SQL Server Data Tools( 以前のバージョンの Business Intelligence Development Studio) の SSIS デザイナー を利用して行えます SSIS デザイナーを利用すると データの転送に加えて 複雑な変換処理を追加したり 次のように転送の前後に行いたい処理 (FTP によるファイル取得やメール送信 SQL の実行など ) を追加したりできるようになります SSIS デザイナーの利用例 FTP でファイルを取得したり 複数のファイルをまとめて処理する Foreach Loop メールを送信したりすることもできる さまざまなタスクを実行可能 SSIS デザイナーについては この自習書では説明していませんが 本自習書シリーズの Integration Services 入門 で詳しく説明していますので こちらもぜひご覧いただければと思います 以降では Integration Services の インポート / エクスポートウィザード を利用して CSV ファイルとやり取りする方法と Access データベースをインポートする方法を説明します 28

3.2 Integration Services による CSV ファイルへのエクスポート インポート / エクスポートウィザードによるエクスポート それでは Integration Services の インポート / エクスポートウィザード を試してみましょう ここでは sampledb データベースの 社員 テーブルのデータを CSV( カンマ区切り ) 形式のファイルへエクスポートしてみましょう. インポート / エクスポートウィザードを起動するには 次のように Management Studio でコピー元となるデータベース (sampledb) を右クリックして [ タスク ] メニューの [ データのエクスポート ] をクリックします [ データのエクスポート ] をクリック 2. これにより インポート / エクスポートウィザードが起動されるので [ 次へ ] ボタンをクリ ックして 次へ進みます 29

3. 次の [ データソースの選択 ] 画面では コピー元となるデータを指定します 2 3 今回は 事前に sampledb データベースを選択してウィザードを起動しているので [ データベース ] に sampledb が選択されていることを確認できます また [ データソース ] には SQL Server Native Client.0 が選択されていますが これは SQL Server 202 をコピー元にするという意味です [ サーバー名 ] には SQL Server の名前が選択されていることを確認して [ 次へ ] ボタンをクリックします 4. 次の [ 変換先の選択 ] 画面では 変換先 ( エクスポート先 ) を指定します [ フラットファイル変換先 ] を選択 2 出力先となるファイルの名前を入力 3 テキスト修飾子に ( 二重引用符 ) を入力 4 今回は CSV ファイルへデータをエクスポートするので [ 変換先 ] で フラットファイル 30

変換先 を選択します [ ファイル名 ] へは エクスポート先となる任意のファイル名 ( 画面は C:\shain2.txt) を入力します また [ テキスト修飾子 ] に " ( 二重引用符 ) を入力して データを " で囲むようにします 設定後 [ 次へ ] ボタンをクリックします 5. 次の [ テーブルのコピーまたはクエリの指定 ] 画面では [ つ以上のテーブルまたはビューからデータをコピーする ] が選択されていることを確認して [ 次へ ] ボタンをクリックします [ つ以上のテーブルまたはビューからデータをコピーする ] を選択 もし こちらを選択した場合は SELECT ステートメントを記述して その結果を変換先へコピーできる 2 6. 次の [ フラットファイルの変換先の構成 ] 画面では コピー元となるテーブルを選択します 今回は [ 変換元テーブルまたはビュー ] で 社員 テーブルを選択します 2 3 また [ 列区切り記号 ] で [ コンマ {,}] が選択されていることを確認します これで 社員 テーブルを CSV 形式へエクスポートできるようになります 設定後 [ 次へ ] ボタンをクリ 3

ックします 7. 次の [ パッケージの保存および実行 ] 画面では このデータ転送をすぐに実行するか 後から 実行するために保存するかを選択します 2 今回はすぐに実行するので [ すぐに実行する ] が選択されていることを確認して [ 次へ ] ボタンをクリックします 8. 最後の [ ウィザードの完了 ] 画面で [ 完了 ] ボタンをクリックすると データのエクスポートが開始されます 9. エクスポートが完了すると 次のように [ 操作は正常に実行されました ] 画面が表示されます [ 状態 ] が 成功 と表示されていることを確認して [ 閉じる ] ボタンをクリックします 32

2 Note: エラー データファイルを開けません が発生する場合は NTFS アクセス許可を付与 ウィザードの実行で 次のように データファイルを開けません エラーが発生する場合は NTFS の書き込み 権限がない場合に発生します NTFS アクセス許可を付与するか 別途アクセス許可のあるフォルダーを作成して (C:\temp など ) そこへ出力 するようにしてみてください 33

エクスポートしたデータの確認. ウィザードでエクスポートしたデータを確認するには Windows エクスプローラーを起動 して C:\shain2.txt ファイルをメモ帳で開きます コピーの完了後 C: shain2.txt ファイルをダブルクリックしてメモ帳で開く 各列のデータが (2 重引用符 ) で囲まれていることを確認 それぞれの列がカンマ区切りで表示され データが " ( 2 重引用符 ) で囲まれていることを確認できます データを " で囲んでおくと データ内にカンマがあったとしても それを区切り記号と間違えないようになります このように Integration Services を利用すると CSV ファイルへのエクスポートを GUI 操作だけで簡単に行うことができるようになるので 大変便利です 34

3.3 Integration Services による CSV ファイルのインポート インポート / エクスポートウィザードでのインポート インポート / エクスポートウィザードでは CSV ファイルを SQL Server 内へインポートする ことも簡単に行うことができます Let's Try それでは これを試してみましょう 前の Step でエクスポートした C:\shain2.txt ファイル を SQL Server へインポートしてみましょう. まずは [ スタート ] メニューの [ すべてのプログラム ] [Microsoft SQL Server 202] から [ データのインポートおよびエクスポート (32 ビット ) または (64 ビット )] をクリッ クします (X64 環境では (64 ビット ) メニューをクリックします ) 2. インポート / エクスポートウィザードが起動されたら [ 次へ ] ボタンをクリックします 35

3. 次の [ データソースの選択 ] 画面では データのコピー元を選択します コピー元がテキス トファイルの場合は [ データソース ] で [ フラットファイルソース ] を選択します 2 続いて [ ファイル名 ] の [ 参照 ] ボタンをクリックして コピー元となるファイルを選択し ます 次のように [ ファイルの場所 ] で ローカルディスク (C:) を選択します 2 3 C: ドライブ内のすべてのファイルが表示されたら C:\shain2.txt ファイルを選択して [ 開く ] ボタンをクリックします 4. [ データソースの選択 ] 画面へ戻ったら 次のように [ ファイル名 ] へ Shain2.txt ファイルへのパスが表示されているのを確認します 36

2 テキスト修飾子に ( 二重引用符 ) を入力 [ テキスト修飾子 ] へは " (2 重引用符 ) を入力します 5. 続いて 次のように [ 列 ] ページをクリックして開きます [ 列 ] ページでは テキストファ イルのデータ形式を設定することができます 2 4 3 5 [ 行区切り記号 ] に " 改行 " を表す {CR}{LF} が選択され [ 列区切り記号 ] にコンマ {,} が選択されていることを確認します 今回取り込むファイルは CSV( カンマ区切り ) ファイルなので このままの設定で大丈夫です [2~7 行のプレビュー ] には コピー元の CSV ファイルのデータが表示され 先頭データ行が列名として使用されていることを確認できます 確認後 [ 次へ ] ボタンをクリックしま 37

す 6. 次の [ 変換先の選択 ] 画面では コピー先を指定します 今回は SQL Server へインポートするので [ 変換先 ] で SQL Server Native Client.0 を選択し [ サーバー名 ] へ SQL Server の名前を入力します [ データベース ] へは インポート先となるデータベースを選択しますが ここでは [ 新規作成 ] ボタンをクリックして 新しくデータベースを作成します 2 7. [ データベースの作成 ] ダイアログが表示されたら [ 名前 ] へ新しく作成する任意のデータ ベース名 ( 今回は SSISDB) を入力し [OK] ボタンをクリックします これで SSISDB という名前のデータベースが作成されます 2 8. [ 変換先の選択 ] 画面へ戻ったら [ 次へ ] ボタンをクリックして次の画面へ進みます 38

9. 次の [ コピー元のテーブルおよびビューを選択 ] 画面では インポート元とインポート先とな るテーブルを指定します 今回のようにインポート元がテキストファイルの場合には [ 変換 元 ] へファイルパス (C:\shain2.txt) が表示されます [ 変換先 ] へは [dbo].[shain2] と表示されますが これは SSISDB データベース内へ shain2 という名前のテーブルを作成するという意味です( テーブルは実際にデータが転送されるときに自動作成されます ) テーブル名は ここで変更することもできますが 今回は shain2 という名前のままにしておきます 0. 続いて [ マッピングの編集 ] ボタンをクリックします すると 次のように [ 列マッピング ] ダイアログが表示されて 作成されるテーブルの列名やデータ型などを変更できるようになり 39

ます [ マッピングの編集 ] をクリックした場合はコピーしない列を設定したりできる CSV ファイルの列数とテーブルの列数が異なる場合に役立つ 列名やデータ型の変更も可能 既定では テキストファイルのデータは varchar データ型として設定され 列名は 変換 元と同じ列名が設定されます 2 今回は 入社日 と 部門番号 は < 無視 > を選択して コピー対象から外すようにします このダイアログでは データ型やサイズなども変更できますが 今回は このままで [OK] ボタンをクリックします. [ コピー元のテーブルおよびビューを選択 ] 画面へ戻ったら [ 次へ ] ボタンをクリックします 40

2. 次の [ パッケージの保存および実行 ] 画面では [ すぐに実行する ] を選択して [ 次へ ] ボタ ンをクリックします 2 3. 最後の [ ウィザードの完了 ] 画面で [ 完了 ] ボタンをクリックすると データのインポートが 開始されます 4

4. インポートが完了すると [ 操作は正常に実行されました ] 画面が表示されます [ 状態 ] が 成 功 と表示されていることを確認して [ 閉じる ] ボタンをクリックします インポートされたデータの確認. ウィザードでインポートしたデータを確認するには Management Studio のオブジェクトエクスプローラーで [ データベース ] フォルダーを右クリックして [ 最新の情報に更新 ] をクリックします SSISDB データベースが表示されたら 次のように[ テーブル ] フォル 42

ダーを展開して shain2 という名前のテーブルを表示します 2. 続いて shain2 テーブルを右クリックして [ 上位 000 行の選択 ] をクリックします 2 shain2 テーブルのデータが表示される これにより shain2 テーブルのデータが表示されます 社員番号と氏名 給与がコピーされていて 入社日と部門番号については コピーされていないことを確認できます このように Integration Services では インポート元の CSV ファイルの列数とテーブルの列数が異なる場合にも 簡単にコピーすることができます ( 前の Step で利用した bcp コマンドで同じことを実現しようとすると フォーマットファイルを作成しなければなりません ) 43

3.4 Access データベース (.accdb/.mdb) のインポート Access データベース (.accdb/.mdb) のインポート Integration Services を利用すると Access データベース (.accdb/.mdb ファイル ) も簡単 にインポートすることができます Let's Try それでは これを試してみましょう ここでは Microsoft Access 200 に付属の ノースウィンド サンプルデータベースを SQL Server へインポートしてみましょう ノースウィンドサンプルデータベースは 販売管理を題材としたサンプルデータベースで 次のように商品に関する受注情報が格納されています 以降の手順を試すには このノースウインドサンプルデータベース ( ノースウィンド.accdb) が必要になりますが ほかの.accdb ファイルや Access 2003 以前のデータベース (.mdb ファイル ) でもほとんど同じように試せるので ノースウィンドサンプルデータベースがない場合は 任意の.accdb/.mdb ファイルで試してみてください Microsoft Access データベースエンジン 200 再頒布可能コンポーネント Integration Services を使って Access 200 のデータベース (.accdb) をインポートするには 44

ローカルマシン ( インポート / エクスポートウィザードを実行するマシン ) に Office 200 をインストールしておくか インストールしていない場合は 下記サイトから Access データベースエンジン 200 再頒布可能コンポーネント をダウンロードして インストールしておく必要があります Access データベースエンジン 200 再頒布可能コンポーネント http://www.microsoft.com/ja-jp/download/details.aspx?id=3255 32-bit 環境の場合は AccessDatabaseEngine.exe X64 ( 64-bit ) 環境の場合は AccessDatabaseEngine_X64.exe ファイルをダウンロードしてインストールしておきます ダウンロードしたファイル AccessDatabaseEngine.exe は ダブルクリックすれば 次のようにインストーラーが起動して インストールすることができます 45

なお Access 2003 以前のデータベース.mdb をインポートする場合には 上記のコンポーネ ントは不要です (Access 2007 以降のデータベース.accdb をインポートする場合に必要 ) インポート / エクスポートウィザードの起動. まずは 次のように [ スタート ] メニューの [Microsoft SQL Server 202] から [ データのインポートおよびエクスポート (32 ビット ) または (64 ビット )] をクリックして ウィザードを起動します (X64 環境の場合は (64 ビット ) メニューをクリックします ) 46

2. インポート / エクスポートウィザードが起動したら [ 次へ ] ボタンをクリックします 3. 次の [ データソースの選択 ] 画面では [ データソース ]( コピー元となるデータベース ) に Microsoft Access(Microsoft Access Database Engine) を選択します(X64 環境の場合に (64 ビット ) メニューをクリックせずに (32 ビット ) メニューをクリックした場合は このデータソースが表示されないので注意してください ) 2 続いて [ ファイル名 ] の [ 参照 ] ボタンをクリックして [ ファイルを開く ] ダイアログを表 示します 47

2 3 [ すべてのファイル (*.*)] を選択して ノースウィンドサンプルデータベース ( ノース ウィンド.accdb) を選択し [ 開く ] ボタンをクリックします [ データソースの選択 ] 画面へ戻ったら [ 次へ ] ボタンをクリックします Note: Access 2003 データベース (.mdb) をインポートしたい場合 Access 2003 以前のデータベース (.mdb ファイル形式のデータベース ) をインポートしたい場合にも [ データソース ] に Microsoft Access(Microsoft Access Database Engine) を選択することが可能です あるいは [ データソース ] で [Microsoft Access(Microsoft Jet Database Engine)](Jet エンジン ) を選択してもインポートを行うことが可能です ただし Jet は 32 ビット版のみしか提供されていないので X64 環境の場合は (32 ビット ) のメニューからインポート / エクスポートウィザードを起動する必要があります 4. 次の [ 変換先の選択 ] 画面では [ 変換先 ] に SQL Server Native Client.0 を選択 して [ サーバー名 ] に SQL Server の名前 ( 画面は SERVER) を入力します 2 2 3 [ データベース ] で SSISDB を選択して [ 次へ ] ボタンをクリックします 48

5. 次の [ テーブルのコピーまたはクエリの指定 ] 画面では [ つ以上のテーブルまたはビュー からデータをコピーする ] を選択して [ 次へ ] ボタンをクリックします 2 6. 次の [ コピー元のテーブルおよびビューを選択 ] 画面では Access データベース内のテー ブルが一覧されます 2 ここでは 仕入先 や 社員 受注 受注明細 商品 得意先 など 任意のテー ブルをチェックして インポート対象に設定します 設定後 [ 次へ ] ボタンをクリックしま す 49

7. 次の [ データ型マッピングの確認 ] 画面では テーブル内の各列のマッピング ( 変換されるデ ータ型 ) を確認して [ 次へ ] ボタンをクリックします 8. 次の [ パッケージの保存および実行 ] 画面では [ すぐに実行する ] を選択して [ 次へ ] ボタ ンをクリックします 2 9. 最後の [ ウィザードの完了 ] 画面で [ 完了 ] ボタンをクリックすると データのコピーが開始 されます 50

0. インポートが完了すると 次のように [ 操作は正常に実行されました ] 画面が表示されます [ 状態 ] が 成功 と表示されていることを確認して [ 閉じる ] ボタンをクリックします 以上で Access データのインポートが完了です 5

インポートされたデータの確認. インポートしたデータを確認するには Management Studio のオブジェクトエクスプローラーで SSISDB データベースを展開して [ テーブル ] フォルダーを右クリックし [ 最新の情報に更新 ] をクリックします インポートしたテーブル ( 仕入先や社員 受注 受注明細 商品 得意先など ) が表示されることを確認できます 2. 次に 社員 テーブルや 商品 テーブルを右クリックして [ 上位 000 行の選択 ] をクリックし テーブルの中身を確認しておきましょう 社員 テーブルのデータの確認 2 52

商品 テーブルのデータの確認 2 Note: Access 側で設定された主キーやリレーションシップは転送されない Integration Services では Access データベース側で設定された主キーやリレーションシップなどの制約はコピ ーされません Access 側で設定されていたリレーションシップは 次のとおりです Integration Services で取り込んだデータを Management Studio で確認すると 次のようになります 53

社員テーブルの列の一覧 主キーと外部キーには鍵のアイコンが付くが 設定されていない 主キーと外部キーが一覧される場所 ここに存在しないことからも主キーと外部キーが設定されていないことを確認できる 制約が一覧される場所 ( ココも空 ) [ キー ] フォルダーや [ 制約 ] フォルダーを参照しても 制約が作成されていないことから 制約が転送されてい ないことを確認できます したがって 主キーやリレーションシップなどは データのインポート後に手動で設定 する必要があります 54

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', RECONFIGURE EXEC sp_configure 'Ad Hoc Distributed Queries', RECONFIGURE また OPENROWSET による操作が完了した後は 次のようにアドホッククエリを無効化しておくようにしましょう EXEC sp_configure 'Ad Hoc Distributed Queries', 0 EXEC sp_configure 'show advanced options', 0 RECONFIGURE リモートの SQL Server へ接続する場合 OPENROWSET 関数を利用して リモートの SQL Server( 別マシンにインストールされた SQL Server 202 や下位バージョンの SQL Server) のデータをクエリする場合には 次のように記述します SELECT * FROM OPENROWSET('SQLNCLI', 'Server=BAMBOO;Trusted_Connection=yes;', 'SELECT * FROM sampledb.dbo. 社員 ' ) 55

第 引数の SQLNCLI は SQL Server Native Client.0 を利用するという意味で 第 2 引数では Server= に続けて 接続したい SQL Server の名前 ( 画面は BAMBOO) を指定します また ; ( セミコロン ) を記述して ;Trusted_Connection=yes; と記述することで Windows 認証での接続を試みることができます ( セミコロンの部分を カンマにしないように注意してください ) 第 3 引数には リモートの SQL Server で実行したい SELELCT ステートメントを記述します このように OPENROWSET 関数を利用すると リモート ( 外部データ ) を簡単にクエリすることができます また OPENROWSET で取得した結果に対して Step2 で説明した SELECT.. INTO を利用すれば 結果をもとにテーブルを作成することもできます Access データベース (.accdb/.mdb) をクエリする場合 OPENROWSET では 前述の Access データベースエンジン 200 再頒布コンポーネント をインストールしていれば Access のデータベース (.accdb/.mdb) をクエリすることもできます これは 次のように利用します (Access 200 データベースへ接続する場合 ) SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.2.0', 'C:\temp\ ノースウィンド.accdb';'admin';'', 'SELECT * FROM 社員 ') Access データベースへ接続する場合には 第 引数へ Microsoft.ACE.OLEDB 2.0 を指定 56

し 第 2 引数には.accdb または.mdb ファイルへのパスを記述します ( ここでは Access 200 のノースウィンドサンプルデータベースへのパスを記述しています ) パスに続けて ; ( セミコロン ) を記述し ;'admin';'' と指定します これは Access に接続するためのユーザー名とパスワードの指定ですが デフォルトでは admin/ パスワードなしで接続できます また セミコロンの部分は カンマにしないように注意してください 第 3 引数には "SELECT * FROM 社員 " のように Access データベースに対して実行したい任意の SELECT ステートメントを記述できます Note: エラー アクセスが拒否されました 列情報を取得できません が表示される場合 実行時には 次のように アクセスが拒否されました および 列情報を取得できません エラーが発生する場合があり ます このエラーは 次のように AllowInProcess と DynamicParameters プロパティを有効化 ( へ設定 ) すること で回避できます これを実行してもエラーが出る場合は SQL Server を再起動してみてください それでもエラーが出る場合は OS も再起動してみてください なお 上記のプロパティは オブジェクトエクスプローラーで 次のように [ サーバーオブジェクト ] の [ リンクサーバー ] [ プロバイダー ] を展開して Microsoft.ACE.OLEDB 2.0 のプロパティを開き 動的パラメーター と InProcess 許可 をチェックしても設定することができます 2 3 57

Note: エラー データソースオブジェクトが初期化できませんでした が表示される場合実行時に 次のように データソースオブジェクトが初期化できませんでした エラーが発生する場合には SQL Server のサービスアカウントの temp フォルダーに対する NTFS アクセス許可がない場合か ファイルのパスを間違っている場合 ( 存在しないフォルダー名やファイル名を指定している場合 ) などで発生します OPENROWSET 関数は 内部的に サービスアカウントの temp フォルダー ( 既定では C:\Users\< サービスアカ ウント名 >\AppData\Local フォルダー ) へアクセスするため このフォルダーに対して OPENROWSET の実行ユ ーザーがアクセス許可を持っている必要があります Note: 32 ビット環境の場合は Jet で Access 2003 以前のデータベース (.mdb) を参照可能 32 ビット環境では Jet の OLEDB プロバイダーを利用して Access 2003 以前のデータベース (.mdb ファイル ) を クエリすることができます これは 次のように利用できます SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'C:\temp\Northwind.mdb';'admin';'', 'SELECT * FROM 社員 ') この Jet プロバイダーは SQL Server 202 のインストール時に自動的にインストールされるので Access データ ベースエンジン 200 再頒布コンポーネント をインストールする必要はありません ただし この Jet プロバイダー は 32 ビットのみの提供なので X64 環境では利用することができません (OPENROWSET は 64 ビットで動作するた め ) 実行時に アクセスが拒否されました および 列情報を取得できません エラーが発生する場合は 次のように Jet プ ロバイダーに対して AllowInProcess と DynamicParameters プロパティを有効化することで回避できます Excel データ (.xlsx/.xls) をクエリ OPENROWSET 関数では Excel データ (.xlsx/.xls ファイル ) をクエリすることもできます これは 次のように利用します (Excel 200 データの場合 ) SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.2.0', 'Excel 2.0;Database=C:\temp\Shohin.xlsx;', 'SELECT * FROM [Sheet$]') 58

C: temp Shohin.xlsx ファイル (Sheet のデータ ) Excel 200 へ接続する場合には Access 200 のときと同様 Access データベースエンジン 200 再頒布コンポーネント を利用するので 第 引数には Microsoft.ACE.OLEDB.2.0 と指定します 第 2 引数には Excel 2.0;Database=C:\temp\Shohin.xlsx; のように記述します Excel 2.0 と指定することで Excel データであることを指定し Database= に続けて.xlsx または.xls ファイルへのパスを記述します 第 3 引数には "SELECT * FROM [Sheet$]" のように記述し シート名に $ マークを付けて 大カッコ [ ] で囲みます Excel 側で 名前付き範囲 を作成している場合は $ マークなしで 大カッコ [ ] で囲んで名前付き範囲を指定することもできます このように OPENROWSET 関数を利用すると Excel データも簡単にクエリすることができます なお クエリする Excel ファイルが Excel によって開かれている場合は エラーになるので 必ず Excel を終了してから このクエリを実行するようにします Note: 32 ビット環境の場合は Jet で Excel 2003 以前のファイル (.xls) を参照可能 32 ビット環境では Jet の OLEDB プロバイダーを利用して Excel 2003 以前のファイル形式 (.xls ファイル ) をク エリすることができます これは 次のように記述します SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\temp\Shohin.xls;', 'SELECT * FROM [Sheet$]') この Jet の OLEDB プロバイダーは 32 ビットのみの提供なので X64 環境では利用することができません Oracle データベースをクエリ OPENROWSET 関数では Oracle データベース (Oracle 9i や 0g g など ) をクエリする こともできます これは 次のように利用します (Oracle g R2 データベースの場合 ) SELECT * FROM OPENROWSET('OraOLEDB.Oracle', 'ORCL';'SCOTT';'tiger', 'SELECT * FROM EMP') 59

Oracle g R2 データベースへ接続する場合は 第 引数へ OraOLEDB.Oracle を指定し 第 2 引数には 'ORCL';'SCOTT';'tiger' のように ローカル ネット サービス名 ユーザー名 パスワードの順に記述します 第 3 引数には "SELECT * FROM EMP" のように Oracle Server に対して実行したい任意の SELECT ステートメントを記述できます なお Oracle データベースへ接続するには 事前に Oracle Client ソフトウェアをインストールして ローカル ネット サービス名を設定しておく必要があります このように OPENROWSET 関数を利用すると Oracle データベースも簡単にクエリできるようになります Note: エラー アクセスが拒否されました 列情報を取得できません が表示される場合 実行時には 次のように アクセスが拒否されました および 列情報を取得できません が発生する場合があります このエラーは 次のように AllowInProcess と DynamicParameters プロパティを有効化 ( へ設定 ) すること で回避できます これを実行してもエラーが出る場合は SQL Server を再起動してみてください それでもエラーが出る場合は OS も 再起動してみてください 60

3.6 OPENROWSET.. BULK によるテキストファイルのインポート OPENROWSET.. BULK でテキストファイルを一括インポート OPENROWSET 関数では テキストファイルを一括インポートする機能もあります これは 次 のように利用します SELECT * FROM OPENROWSET( BULK ' テキストファイル名 ',FORMATFILE = ' フォーマットファイル名 ' ) 別名 OPENROWSET での一括インポートでは フォーマットファイルを別途作成する必要があります このファイルは bcp コマンドや BULK INSERT というステートメントで利用できるものと同じ形式なのですが インポート先の列名や列数と テキストファイル内の列数や区切り文字などを対応付けするためのファイルです これは 次のような形式をとります フォーマットファイルの自動生成 : bcp コマンド bcp コマンドには 既存のテーブルをもとに フォーマットファイルを自動生成してくれる機能があります たとえば 次のようにインポート先のテーブルがあるとします -- インポート先のテーブル CREATE TABLE t ( a int,b char(0 ) ) この場合に bcp コマンドをコマンドプロンプトから次のように実行すると フォーマットファイルを自動生成してくれます bcp sampledb.dbo.t format nul /T /c /t "," /f C:\test.fmt 自動生成されたフォーマットファイル ( カンマ区切りの CSV ファイル用 ) Step2 で利用した bcp コマンドとの違いは format nul と /f オプションだけです 残りのオプションは同じ意味で /T で Windows 認証 /c /t "," でカンマ区切りのテキストファイル形式であることを指定しています /f オプションでは 生成したいフォーマットファイルの名前を 6

任意で指定できます ( 拡張子を.fmt とするのが慣習です ) なお 別サーバーや名前付きインスタンスの場合は /S オプションを利用して SQL Server のインスタンス名を指定する必要があります ( ローカルの既定のインスタンスの場合は /S オプションを省略可能 ) また 実行時に BCP 形式のファイルを開けません エラーが発生する場合は NTFS の書き込み権限がない場合なので 別途アクセス許可のあるフォルダーを作成して (C:\temp など ) そこへフォーマットファイルを作成するようにしてください OPENROWSET.. BULK での一括インポート 次に OPENROWSET 関数でテキストファイルを一括インポートしてみましょう 次のテキスト ファイル ( カンマ区切り ) を t テーブルへ一括インポートするとします このファイルが C:\bulkTest.csv の場合は OPENROWSET 関数を次のように記述します SELECT * FROM OPENROWSET( BULK 'C:\bulkTest.csv',FORMATFILE = 'C:\test.fmt' ) b これを 次のように INSERT.. SELECT で利用すれば t テーブルへ一括インポートできるよ うになります INSERT INTO t SELECT * FROM OPENROWSET( BULK 'C:\bulkTest.csv',FORMATFILE = 'C:\test.fmt' ) b 62

MERGE ステートメントと OPENROWSET.. BULK の連携 OPENROWSET.. BULK は SQL Server 2008 から提供された機能の MERGE ステートメントと連携して利用することもできます MERGE ステートメントは データが存在する場合には UPDATE 存在しない場合には INSERT 処理が行える非常に便利なステートメントです ( 詳しくは 本自習書シリーズの 開発者のための Transact-SQL 応用 で説明しています ) したがって MERGE ステートメントと OPENROWSET.. BULK を組み合わせると 一括インポート時に データが既に存在する場合には UPDATE 存在しない場合には INSERT 処理が行えるようになります たとえば インポートしたいファイルが 次の C:\bulkTest2.csv だとします この場合は 次のように実行することができます MERGE INTO t USING OPENROWSET( BULK 'C:\bulkTest2.csv',FORMATFILE = 'C:\test.fmt' ) bulk ON t.a = bulk.a WHEN MATCHED THEN UPDATE SET t.b = bulk.b WHEN NOT MATCHED THEN INSERT VALUES ( bulk.a, bulk.b ); t テーブル C: bulktest2.csv ファイル MERGE UPDATE されたデータ INSERT されたデータ このように OPENROWSET 関数は テキストファイルを一括インポートするシナリオでも大変 役立ちます 63

3.7 リンクサーバーによる外部データのクエリ リンクサーバー OPENROWSET 関数では 毎回クエリの実行時にプロバイダー名や接続パスを記述する必要があるので 何度もクエリを実行する場合には面倒です これを解決してくれる機能が リンクサーバー です リンクサーバーを利用すると 何度もアクセスするリモートデータ ( 接続先 ) に対して 名前を付けて保存しておくことができます Let's Try それでは これを試してみましょう ここでは Access 200 のノースウィンドサンプルデータベース ( ノースウィンド.accdb) に対して リンクサーバーを作成する手順を試してみましょう ( この手順を試すには 事前に Access データベースエンジン 200 再頒布コンポーネント をインストールしておく必要があります ). リンクサーバーを作成するには まず Management Studio のオブジェクトエクスプローラーで [ サーバーオブジェクト ] を展開し [ リンクサーバー ] フォルダーを右クリックして [ 新しいリンクサーバー ] をクリックします 2. これにより [ 新しいリンクサーバー ] ダイアログが表示されるので [ リンクサーバー ] へ 任意の名前 ( 画面は NW) を入力します 2 64

次に [ サーバーの種類 ] で その他のデータソース を選択して [ プロバイダー ] で Microsoft Office 2.0 Access Database Engine OLE DB Provider を選択します [ 製品名 ] へは 任意の文字 ( 画面は Access 200) を入力し [ データソース ] へ Access データベース (.accdb または.mdb ファイル ) へのパスを入力します ( ここでは C:\temp\ ノースウィンド.accdb) 設定後 [OK] ボタンをクリックすれば リンクサーバーの作成が完了です Note: [ 製品名 ] や [ プロバイダー文字列 ] の設定リンクサーバーの設定画面の データソースに対する [ プロバイダー ] や [ 製品名 ](product_name) [ プロバイダー文字列 ](provider_string) については SQL Server オンラインブックの Transact-SQL リファレンスにある sp_addlinkedserver で詳しく解説されています プロバイダ名や製品名 3. 作成したリンクサーバーを次のように展開すると Access データベース内のテーブルの一 覧を参照することができます 65

Note: エラー アクセスが拒否されました や 初期化できませんでした が表示される場合 テーブルを展開するときに 次のように アクセスが拒否されました エラーが発生する場合は OPENROWSET の ときと同様 AllowInProcess と DynamicParameters プロパティを有効化しておくようにします また データソースオブジェクトが初期化できませんでした エラーが発生する場合は SQL Server のサービ スアカウントの temp フォルダーに対して NTFS アクセス許可を設定したり ファイルのパスが間違っていない かなどを確認してみてください 4. 次に 作成したリンクサーバー NW を利用して 社員 テーブルのデータを参照してみ ましょう SELECT * FROM NW... 社員 66

リンクサーバーでは リンクサーバー名. データベース名. スキーマ名. テーブル名 という構文でテーブルへアクセスできますが Access の場合は リンクサーバー自体がデータベースなので データベース名を省略しています また Access にはスキーマも存在しないので これも省略して NW... 社員 と記述しています このようにリンクサーバー機能を利用すると OPENROWSET 関数のように 毎回プロバイダーを指定したり 接続パスを書かなくて済むようになるので 大変便利です Note: コマンドでリンクサーバーを作成する : sp_addlinkedserver リンクサーバーは sp_addlinkedserver システムストアドプロシージャを利用して コマンドで作成するこ とも可能です これは 次のように利用します EXEC master..sp_addlinkedserver @server = N'NW', @srvproduct = N'Access 200', @provider = N'Microsoft.ACE.OLEDB.2.0', @datasrc = N'C:\temp\ ノースウィンド.accdb' スクリプト生成機能 GUI ベースで作成したリンクサーバーは 次のようにスクリプト生成機能を利用して sp_addlinkedserver を 自動生成できるので 便利です 2 sp_addlinkedserver が自動生成される 67

リモート SQL Server に対してリンクサーバーを作成する場合 リモートの SQL Server( 別マシンにインストールされた SQL Server 202 や下位バージョンの SQL Server) に対してリンクサーバーを作成する場合は 次のように操作します. まず Management Studio で [ リンクサーバー ] フォルダーを右クリックして [ 新しいリンクサーバー ] をクリックします 2. [ 新しいリンクサーバー ] ダイアログが表示されたら [ サーバーの種類 ] で SQL Server を選択し [ リンクサーバー ] へ接続先の SQL Server のインスタンス名を入力 ( 画面は BAMBOO) します 2 SQL Server の名前を記述 3. 次に [ ページの選択 ] で セキュリティ をクリックして [ セキュリティ ] ページを開き 任意の接続方法を選択します 68

2 3 画面のように ログインの現在のセキュリティコンテキストを使用する をチェックした場合は 現在ログインしているユーザー情報を利用して リモートの SQL Server へのログインを試みるようになります 設定後 [OK] ボタンをクリックすれば リンクサーバーの作成が完了です 4. リンクサーバー作成後は 設定した SQL Server 上のデータベースの一覧やテーブルを参照できるようになります 2 リンクサーバーを利用したクエリ実行 リモート SQL Server のデータベースやテーブルを一覧できる クエリを実行するときの構文は 前述したように リンクサーバー名. データベース名. スキーマ名. テーブル名 と 4 つの名前を指定します ( 画面は BAMBOO という名前の SQL Server の sampledb データベース dbo スキーマ内の 社員 テーブルをクエリしています ) なお リンクサーバーが名前付きインスタンスの場合は [BAMBOO\SQL] のように [ ]( 大カッコ ) で囲んで名前を指定する必要があります 69

STEP 4. テーブル関連の便利な操作 この STEP では データ挿入時の自動採番や DEFAULT 値の設定など テーブ ル関連のよく利用する機能について説明します この STEP では 次のことを学習します 自動的に連続番号を振る : IDENTITY プロパティ データの全削除を高速に実行する : TRUNCATE TABLE 列に既定値を設定する : DEFAULT 値 70

4. 自動的に連続番号を振る : IDENTITY プロパティ IDENTITY プロパティ IDENTITY プロパティは 自動的に連番を振ることができる機能です 構文は 次のとおりです IDENTITY ( 初期値, 増分 ) 初期値には 採番を始める最初の値を記述します 増分には 採番する際に増やしていく数を記述します たとえば IDENTITY (,) と記述した場合は から始まって ずつ増加していく番号 ( 2 3 ) IDENTITY (50,2) と記述した場合は 50 から始まって 2 ずつ増加していく番号 (50 503 505 ) を作成できます 記述する際に 初期値と増分を省略した場合には IDENTITY(,) と解釈されます Let's Try それでは これを試してみましょう. idtest という名前のテーブルを作成し autonum 列へ IDENTITY プロパティを設定します USE sampledb CREATE TABLE idtest ( autonum int IDENTITY (,),col char(0),col2 char(0) ) このように IDENTITY プロパティは テーブルの作成時に列に対して設定します データの挿入. 次に idtest テーブルへデータを何件か追加してみましょう IDENTITY プロパティを設定したテーブルへデータを追加 (INSERT) するには IDENTITY プロパティを設定した列以外 ( 今回は col と col2) を指定して値を記述します 7

-- データの INSERT INSERT INTO idtest (col,col2) VALUES ('aaa', 'xxx') INSERT INTO idtest (col,col2) VALUES ('bbb', 'yyy') INSERT INTO idtest (col,col2) VALUES ('ccc', 'zzz') -- データの確認 SELECT * FROM idtest データの追加後 SELECT ステートメントで結果を確認すると autonum 列には 2 3 と からの連続番号が割り振られていることを確認できます このように IDENTITY プロパティを使用すると 自動的に連続番号を振ることができるので便利です ただし IDENTITY プロパティを設定できる列は テーブル内で つだけです Note: テーブルデザイナーで IDENTITY プロパティの設定 IDENTITY プロパティは Management Studio の テーブルデザイナー 機能を利用して GUI 操作で設定することもできます テーブルデザイナーで IDENTITY プロパティを設定するには 次のようにオブジェクトエクスプローラーで 設定したいテーブルを右クリックして [ デザイン ] をクリックします 2 IDENTITY プロパティを設定したい列を選択 列のプロパティ タブ 3 IDENTITY の指定 で (ID である ) を はい ID の増分 は 増分 IDENTITY シード は 初期値 テーブルデザイナーが表示されたら IDENTETY プロパティを設定したい列を選択し [ 列のプロパティ ] タブにある IDENTITY の指定 で はい を選択して ID の増分 へ増分値 IDENTITY シード へ初期値を設定します 72

IDENTITY を設定した列へ明示的に値を追加 : IDENTITY_INSERT IDENTITY プロパティを設定した列 ( 以下 IDENTITY 列 ) には デフォルトでは明示的に値を 追加することができません 値を追加しようとすると 次のようにエラーが発生します IDENTITY 列へ 50 という値を追加しようとしている 値を追加したい場合には 次のように SET ステートメントを使って IDENTITY_INSERT を ON へ設定する必要があります SET IDENTITY_INSERT テーブル名 ON Let's Try それでは これを試してみましょう. まずは SET IDENTITY_INSERT を ON へ設定します SET IDENTITY_INSERT idtest ON 2. 次に autonum 列 (IDENTITY 列 ) へ 値を指定して INSERT ステートメントを実行 してみます -- データの INSERT INSERT INTO idtest (autonum, col, col2) VALUES (50, 'ddd', 'zzz') -- データの確認 SELECT * FROM idtest 73

50 を IDENTITY 列へ追加できたことを確認できます このように IDENTITY_INSERT を ON へ設定すると IDENTITY 列へデータを追加できるようになります 明示的に追加した後の採番. 次に SET IDENTITY_INSERT を OFF へ戻して この後に自動採番される値がどうなる かを試してみましょう SET IDENTITY_INSERT idtest OFF INSERT INTO idtest (col, col2) VALUES ('eee', 'zzz') SELECT * FROM idtest 結果は 5 が採番されます このように 明示的に値を追加した後は その値を基準に増 分値が割り当てられるようになります 現在の IDENTITY 値を調べる : IDENT_CURRENT 関数. 現在の IDENTITY 値 ( 現在の最大値 ) は IDENT_CURRENT というシステム関数を利用 して 調べることができます これは 次のように利用します SELECT IDENT_CURRENT ('idtest') 74

結果は 5 が表示されて idtest テーブルの現在の IDENTITY 値 ( 最大値 ) を確認で きます したがって この次に採番される値は 52 となります データを削除した場合の ID 値 次に データを削除した場合に IDENTITY 値がどうなるのかを試してみましょう. 次のように idtest テーブルの IDENTITY 列が 50 と 5 のデータを削除します DELETE FROM idtest WHERE autonum >= 50 2. 続いて 新しいデータを追加して IDENTITY 値を確認します INSERT INTO idtest (col,col2) VALUES ('fff', 'zzz') SELECT * FROM idtest 新しく INSERT したデータには 52 が採番されています このように DELETE ステー トメントでデータを削除しても IDENTITY 値には影響がありません 75

IDENTITY 値を変更する : DBCC CHECKIDENT 現在の IDENTITY 値 ( 現在の最大値 ) を変更したい場合には DBCC CHECKIDENT コマンド を利用します 構文は 次のとおりです DBCC CHECKIDENT (' テーブル名 ', RESEED, 変更後の任意の IDENTITY 値 ) RESEED と指定することで IDENTITY 値を変更することができます それでは これを試してみましょう. idtest テーブルの IDENTITY 値が 4 から始まるように 現在の IDENTITY 値を 3 へ変更してみます DBCC CHECKIDENT ('idtest', RESEED, 3) 現在の IDENTITY 値を 3 に変更 DBCC の実行が完了しました と結果に表示されれば 成功です 2. データを INSERT して IDENTITY 値が変更されたことを確認してみましょう INSERT INTO idtest (col, col2) VALUES ('ggg', 'zzz') SELECT * FROM idtest 追加したデータの IDENTITY 値が 4 になっていることを確認できます( 現在の値を 3 へ変更したので 4 が割り振られています) 76

Note: PRIMARY KEY 制約違反に注意 DBCC CHECKIDENT で IDENTITY を変更した場合は 重複値が PRIMARY KEY 制約違反になることに注意する必要があります たとえば autonum 列の値が 5 6 7 と増えていって "52" になったとき "52" のデータは既に存在しているので ここで重複値が発生します このとき PRIMARY KEY 制約を設定していない場合には そのまま重複値を格納することができますが PRIMARY KEY 制約を設定している場合には 制約違反でエラーが発生してしまいます なお エラーが発生した後に もう一度データの INSERT を実行した場合には "53" が採番されます ( 制約違反エラーが発生しても内部的な採番は行われています ) Note: アプリケーションから IDENTITY 値を取得 : SCOPE_IDENTITY 関数追加された IDENTITY 値をアプリケーションから取得する場合は 他のユーザーが追加した IDENTITY 値を間違って取得しないように注意する必要があります 前述の IDENT_CURRENT はあくまでもテーブル全体としての最新値で 自分が追加した値だという保証がないからです そこで これを解決してくれる ( 自分が追加した値を保証してくれる ) システム関数として SCOPE_IDENTITY が用意されています アプリケーションから IDENTITY 値を取得するには 必ず SCOPE_IDENTITY 関数を利用するようにしてください この関数については 本自習書シリーズの 開発者のための Transact-SQL 応用 編で詳しく説明していますので こちらもぜひご覧いただければと思います Note: Oracle の シーケンス Access の オートナンバー IDENTITY プロパティは Oracle での シーケンス (SEQUENCE: 順序 ) Access での オートナンバー に相当する機能です SQL Server 202 からは Oracle と同じように利用できるシーケンスがサポートされるようになったので 次のように連番を作成することも可能です CREATE SEQUENCE でシーケンスを作成 NEXT VALUE FOR でシーケンスから次の値を取得 77

4.2 データの全削除を高速に実行する : TRUNCATE TABLE TRUNCATE TABLE テーブル内のすべてのデータを削除するには DELETE ステートメントの WHERE 句を省略することで実行することができますが TRUNCATE TABLE というステートメントを利用すると DELETE ステートメントよりも高速にデータを削除できるようになります DELETE ステートメントは 削除する " 行ごと " にトランザクションログへの記録を行いますが TRUNCATE TABLE ステートメントの場合は トランザクションログへの記録を " 行ごと " には行わない ( ページ単位で行う ) からです TRUNCATE TABLE は 次のように利用します TRUNCATE TABLE テーブル名 Let's Try それでは これを試してみましょう. TRUNCATE TABLE ステートメントを利用して idtest テーブルのデータを全削除してみましょう TRUNCATE TABLE idtest コマンドは正常に完了しました と表示されれば 削除が完了しています 2. 次に データが削除されたことを確認しておきましょう SELECT * FROM idtest Note: TRUNCATE TABLE 後の IDENTITY 値を取得 DELETE ステートメントでデータを削除した場合は IDENTITY 値に変化はありませんでしたが TRUNCATE TABLE ステートメントでデータを削除した場合は IDENTITY 値は " 初期値にリセット "(RESEED) されます したがって IDENTITY(, ) と定義している場合には IDENTITY 値は再び "" から始まることになります 78

4.3 列に既定値を設定する : DEFAULT 値 DEFAULT 値 ( 既定値 ) DEFAULT 値 ( 既定値 ) は その名のとおり INSERT 時に値を指定しなかった場合 または 省 略された場合に自動的に補われる値のことです これは 次のように利用します CREATE TABLE テーブル名 ( 列名データ型 DEFAULT 値, ) Let's Try それでは これを試してみましょう. 次のように deftest という名前のテーブルを作成して col2 列へ DEFAULT 値とし て AAA を設定します CREATE TABLE deftest ( autonum int IDENTITY (,),col char(0),col2 char(0) DEFAULT 'AAA' ) 2. 次に deftest テーブルに対して データを追加します DEFAULT 値を設定した col2 列へは 値を指定せずにデータを追加します -- データの INSERT INSERT INTO deftest (col) VALUES ('xxx') INSERT INTO deftest (col) VALUES ('yyy') INSERT INTO deftest (col) VALUES ('zzz') -- データの確認 SELECT * FROM deftest 79

col2 列には 自動的に AAA が追加されていることを確認できます Note: テーブルデザイナーで DEFAULT 値を設定 GUI 操作で DEFAULT 値を設定したい場合は 次のように Management Studio のテーブルデザイナーを操作 します DEFAULT 値を設定したい列を選択 2 既定値またはバインド に DEFAULT 値を設定 DEFAULT 値を設定したい列を選択し [ 列のプロパティ ] タブで 既定値またはバインド へ設定したい値を入力 します 既存のテーブルへ DEFAULT 値を設定する 既存のテーブルに対して DEFAULT 値を設定したい場合は ALTER TABLE ステートメントを利用します それでは これを試してみましょう. deftest テーブルへ DEFAULT 値を設定した col3 列を追加してみます 次のように記述します ALTER TABLE deftest ADD col3 datetime DEFAULT GETDATE() 80

col3 列の追加時に DEFAULT 値を設定 DEFAULT 値には GETDATE 関数のように 関数を指定することができる col3 列を datetime 型で追加し DEFAULT 値へ GETDATE 関数 ( 現在の日時を取得できる関数 ) を指定しています 2. 次に deftest テーブルに対して データを追加します DEFAULT 値を設定した col3 列には データを追加しないようにしてみます INSERT INTO deftest (col) VALUES ('www') SELECT * FROM deftest 既存のデータは NULL 値 既存データに対しても DEFAULT 値を適用したい場合は WITH VALUES を使用する GETDATE 関数によって データを追加したときの時刻が格納される col3 列へ自動的に 現在の日時が格納されていることを確認できます このように DEFAULT 値には関数を指定することもできます Note: 後から DEFAULT 値を追加した場合のデータは NULL 値後から DEFAULT 値を追加した場合は 既存のデータの NULL 値に対しては DEFAULT 値は適用されず NULL 値のままです 既存のデータの NULL 値に対しても DEFAULT 値を適用したい場合には "DEFAULT GETDATE() WITH VALUES" という形で "WITH VALUES" を利用するようにします 3. 次に 列の追加時ではなく 既にある col 列に対して DEFAULT 値を BBB へ設定し てみましょう 次のように入力します ALTER TABLE deftest ADD CONSTRAINT def_col DEFAULT 'BBB' FOR col 既存の列に対して DEFAULT 値を設定するには CONSTRAINT.. FOR を利用します 8

4. 次に deftest テーブルに対して データを追加します テーブル内のすべての列が値を省略できる場合 (DEFAULT 値や IDENTITY NULL の許可が設定されている場合 ) は 次のように DEFAULT VALUES を指定して INSERT ステートメントを記述することができます INSERT INTO deftest DEFAULT VALUES 5. 最後に 追加したデータを確認しておきましょう SELECT * FROM deftest col 列へ BBB が追加されたことを確認できます Goal! 以上ですべての操作が完了です 最後までこの自習書の内容を試された皆さま いかがでしたでしょうか? 今回は データのコピーと現場で役立つ操作集 ということで 筆者自身がよく利用する役立つ機能を紹介しました 中でも Integration Services は大変便利なので ぜひ活用してみていただければと思います Integration Services については 本自習書シリーズの Integration Services 入門 および Integration Services 応用 編でさらに詳しく説明していますので チャレンジしてみてください Transact-SQL には まだまだ役立つ機能がありますので それらについては 本自習書シリーズの Transact-SQL 入門 と 開発者のための Transact-SQL 応用 編を参考にしていただければと思います 82

執筆者プロフィール 有限会社エスキューエル クオリティ (http://www.sqlquality.com/) SQLQuality( エスキューエル クオリティ ) は 日本で唯一の SQL Server 専門の独立系コンサルティング会社です 過去のバージョンから最新バージョンまでの SQL Server を知りつくし 多数の実績と豊富な 経験を持つ OS や.NET にも詳しい SQL Server の専門家 ( キャリア 7 年以上 ) がすべての案件に対応 します 人気メニューの パフォーマンスチューニングサービス は 00% の成果を上げ 過去すべてのお客様環境で驚異的な性能向上を実現 チューニングスキルは世界トップレベルを自負 検索エンジンでは ( 英語情報を含めて ) ヒットしないノウハウを多数保持 ここ数年は BI/DWH システム構築支援のご依頼 が多い 主なコンサルティング実績 大手映像制作会社の BI システム構築支援 ( 会計 / 業務システムにおける予実管理 / 原価管理など ) 大手流通系の DWH/BI システム構築支援 (POS データ / 在庫データ分析 ) 大規模テラバイト級データウェアハウスの物理 論理設計支援および運用管理設計支援大手アミューズメント企業の BI システム構築支援 ( 人事システムにおける人材パフォーマンス管理 ) 外資系医療メーカーの Analysis Services による 販売分析 システムの構築支援 ( 売上 / 顧客データ分析 ) 9 TB データベースの物理 論理設計支援 ( パーティショニング対応など ) ハードウェアリプレイス時のハードウェア選定 ( 最適なサーバー ストレージの選定 ) 高可用性環境の構築 SQL Server 2000(32 ビット ) から SQL Server 2008(x64) への移行 / アップグレード支援 複数台の SQL Server の Hyper-V 仮想環境への移行支援 ( サーバー統合支援 ) 2 時間かかっていた日中バッチ実行時間を わずか 5 分へ短縮 (95.8% の性能向上 ) ピーク時の CPU 利用率 00% のシステムを わずか 0% にまで軽減し 大幅性能向上平均 85.3ms かかっていた処理を わずか 39.2ms へ短縮 (78.8% の性能向上 ) Java 環境 (Tomcat Seasar2 S2Dao) の SQL Server パフォーマンスチューニング etc コンサルティング時の作業例 ( パフォーマンスチューニングの場合 ) アプリケーションコード (VB C# Java ASP VBScript VBA) の解析 / 改修支援 ストアドプロシージャ / ユーザー定義関数 / トリガー (Transact-SQL) の解析 / 改修支援インデックスチューニング /SQL チューニング / ロック処理の見直し 現状のハードウェアで将来のアクセス増にどこまで耐えられるかを測定する高負荷テストの実施 IIS ログの解析 / アプリケーションログ (log4net/log4j) の解析 ボトルネックハードウェアの発見 / ボトルネック SQL の発見 / ボトルネックアプリケーションの発見 SQL Server の構成オプション / データベース設定の分析 / 使用状況 (CPU, メモリ, ディスク, Wait) 解析 定期メンテナンス支援 ( インデックスの再構築 / 断片化解消のタイミングや断片化の事前防止策など )etc 松本美穂 ( まつもと みほ ) 有限会社エスキューエル クオリティ代表取締役 Microsoft MVP for SQL Server(2004 年 4 月 ~) 経産省認定データベーススペシャリスト /MCDBA/MCSD for.net/mcitp Database Administrator SQL Server の日本における最初のバージョンである SQL Server 4.2a から SQL Server に携わり 現在 SQL Server を中心とするコンサルティングを行っている 得意分野はパフォーマンスチューニングと Reporting Services コンサルティング業務の傍ら 講演や執筆も行い マイクロソフト主催の最大イベント Tech Ed などでスピーカーとしても活躍中 SE や ITPro としての経験はもちろん 記名 / 無記名含めて多くの執筆実績も持ち 様々な角度から SQL Server に携わってきている 著書の SQL Server 2000 でいってみよう と ASP.NET でいってみよう ( いずれも翔泳社刊 ) は トップセラー ( 前者は 28,500 部 後者は 6,500 部発行 ) 近刊に SQL Server 202 の教科書 ( ソシム刊 ) がある 松本崇博 ( まつもと たかひろ ) 有限会社エスキューエル クオリティ取締役 Microsoft MVP for SQL Server(2004 年 4 月 ~) 経産省認定データベーススペシャリスト /MCDBA/MCSD for.net/mcitp Database Administrator SQL Server の BI システムとパフォーマンスチューニングを得意とするコンサルタント 過去には 約 3,000 本のストアドプロシージャのチューニングや テラバイト級データベースの論理 物理設計 運用管理設計 高可用性設計 BI DWH システム設計支援などを行う アプリケーション開発 (ASP/ASP.NET C# VB 6.0 Java Access VBA など ) やシステム管理者 (IT Pro) 経験もあり SQL Server だけでなく アプリケーションや OS Web サーバーを絡めた 総合的なコンサルティングが行えるのが強み Analysis Services と Excel による BI システムも得意とする マイクロソフト認定トレーナー時代の 998 年度には Microsoft CPLS トレーナーアワード (Trainer of the Year) を受賞 83