...

SQL Server

by user

on
Category: Documents
23

views

Report

Comments

Transcript

SQL Server
プログラミング
William C.Amo 著
有限会社トップスタジオ 翻訳
目次
はじめに ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・7
謝 辞 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・9
第
1
部
SQL Server プログラミング環境
第 1 章 SQL Server プログラミング環境の概要
27
1.1 SQL Server 環境のコンポーネント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・28
SQL Server ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29
データベースとデータベースオブジェクト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・31
テーブル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・32
インデックス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・33
ストアドプロシージャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35
ネットワークコンポーネント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・36
クライアント側ライブラリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・37
クライアントアプリケーション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・38
Transact-SQL 言語 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・38
1.2 ライセンスモードと接続 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39
接続クライアント数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39
同時使用ユーザー数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39
ノードベースのクライアントアクセス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・40
1.3 文字セットと並べ替え順 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・40
1.4 SQL Server のツール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41
BCP ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41
SQL Server Enterprise Manager ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41
SQL Server プロファイラ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・42
SQL Server クエリアナライザ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・42
1.5 データベースアプリケーションインターフェイスの詳細 ・・・・・・・・・・・・・・・・42
DB-Library ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・43
ODBC ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・43
11
目次
OLE DB と ActiveX Data Objects ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・44
Open Data Services による SQL Server の拡張 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・46
1.6 サンプルプログラム ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・46
1.7 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・47
第 2 章 SQL Server ツールの使用方法
49
2.1 SQL Server Enterprise Manager ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・51
Enterprise Manager の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・51
信託口座サンプルデータベースの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・54
Accounts テーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・57
列制約の作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・58
SQL スクリプトファイルの生成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・59
参照整合性の宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・60
2.2 BCP ユーティリティ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・62
フォーマットファイルの使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・62
BCP ユーティリティの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・64
2.3 SQL Server クエリアナライザ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・66
クエリの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・67
クエリ分析情報の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・67
2.4 SQL Server クライアントネットワークユーティリティ ・・・・・・・・・・・・・・・68
新しいネットワークプロトコルの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・69
DB-Library オプションの設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・69
2.5 makepipe と readpipe ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・70
接続のテスト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・70
結果の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・70
2.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・71
第 3 章 SQL Server のセキュリティ
3.1 SQL Server のセキュリティの概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・73
セキュリティモード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・74
ユーザーとグループ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75
ログイン ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75
ロール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75
権限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75
12
73
目次
3.2 ユーザーとログインの管理 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76
ユーザーとログインの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76
ストアドプロシージャによるユーザーの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76
権限とロール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・78
3.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・85
第
2
部
Transact-SQL 言語
第 4 章 Transact-SQL 入門
89
4.1 投資信託口座データベースの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・89
4.2 Transact-SQL の要素 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・90
コメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・91
リテラル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・92
識別子 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・92
式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・93
キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・95
演算子 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・96
4.3 SET ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・98
ANSI_DEFAULTS オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・99
DATEFORMAT オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・99
NOEXEC オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・100
SHOWPLAN_ALL オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・100
STATISTICS IO オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103
4.4 SQL ステートメントのバッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103
バッチファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103
マルチバッチファイル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103
USE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・104
4.5 EXECUTE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・105
ストアドプロシージャの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・105
文字列の実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・106
4.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・106
13
目次
第 5 章 データ定義言語
5.1 SQL Server のデータ型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・109
バイナリデータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110
文字データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110
日付時刻データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110
整数データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・111
真数データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・111
概数データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・112
通貨データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・112
テキストデータとイメージデータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・113
特殊データ型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・113
Unicode 型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・114
SQL データ型と C++データ型の比較 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・115
5.2 データベースの作成と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・115
物理ファイルの指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・115
ログファイルの指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・116
DROP DATABASE ステートメントによるデータベースの削除 ・・・・・・・・・・・・117
データベースの接続と切断 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・118
5.3 ALTER DATABASE による既存データベースの変更 ・・・・・・・・・・・・・・・・・118
ファイルグループとログファイルの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・119
ファイルとファイルグループの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・119
5.4 CREATE TABLE によるテーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・120
制約の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・120
IDENTITY と ROWGUIDCOL ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・121
計算列の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・121
データ整合性 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・122
5.5 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123
CHECK 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123
DEFAULT 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123
UNIQUE 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・124
PRIMARY KEY 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・124
FOREIGN KEY 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・125
5.6 ルールオブジェクトとデフォルトオブジェクト ・・・・・・・・・・・・・・・・・・・・・・・・・・125
ルールの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・125
デフォルトの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・126
14
109
目次
ルールとデフォルトの削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・126
5.7 NULL データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・127
ANSI_NULLS オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・127
NULL 値のテスト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・127
5.8 既存のテーブルの変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・128
制約の追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・128
NOCHECK オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・129
列の追加と変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・129
DROP TABLE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・129
5.9 インデックスの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・130
インデックスの種類 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・130
CREATE INDEX ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・131
5.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・132
第 6 章 データ操作言語
133
6.1 INSERT ステートメントによるデータ挿入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・134
列名を指定する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・134
SELECT ステートメントの戻り値を挿入する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・135
EXECUTE キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・135
6.2 SELECT ステートメントを使用した基本的なクエリ ・・・・・・・・・・・・・・・・・・136
WHERE 句の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・136
列リストの使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・136
式の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・137
別名の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・139
ORDER BY による結果のソート ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・140
列リスト内での式と制約の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・140
BETWEEN による範囲検索 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・141
IN の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・142
LIKE キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・143
TOP による行選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・146
SELECT INTO によるテーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・148
DISTINCT キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・149
分散クエリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・150
6.3 UPDATE ステートメントによる既存データ更新 ・・・・・・・・・・・・・・・・・・・・・・・・152
ほかのテーブルから選択した値の更新 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・152
15
目次
6.4 DELETE ステートメントによるデータ削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・153
TRUNCATE TABLE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・154
6.5 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・154
第 7 章 Transact-SQL の関数
7.1 データ変換関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・158
Style 引数の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・158
7.2 ドメイン集計関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・160
AVG( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・160
COUNT( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・161
SUM( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・162
MAX( )関数と MIN( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・163
7.3 文字列関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・163
LEN( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・163
UPPER( )関数と LOWER( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・164
LTRIM( )関数と RTRIM( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・164
RIGHT( )関数と LEFT( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・164
SUBSTRING( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・165
CHARINDEX( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・166
STR( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・166
STUFF( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・167
REPLACE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・167
7.4 数学関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168
ABS( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168
POWER( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168
SQUARE( )関数と SQRT( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168
ROUND( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・169
RAND( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・169
7.5 日付時刻関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・170
GETDATE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・170
DATEADD( )関数と DATEDIFF( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・171
DATENAME( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・173
DATEPART( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・174
ISDATE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・174
DAY( )関数、MONTH( )関数、YEAR( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・175
16
157
目次
7.6 システム関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・175
ISNUMERIC( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・175
COALESCE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・176
DATALENGTH( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・177
IDENTITY 列に関する情報の取得 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・177
オブジェクトに関する情報の取得 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・178
ユーザー識別関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・179
7.7 text/image 関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・180
TEXTPTR( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・180
PATINDEX( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・182
SUBSTRING( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・182
7.8 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・182
第 8 章 グループ化と集計
185
8.1 GROUP BY 句 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・185
非集計列の選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・187
WHERE 句による行の制限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・188
ALL キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・189
8.2 グループ結果の制限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・190
WHERE 句と HAVING 句の併用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・190
集計処理をせずにグループを制限する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・191
グループ内の項目数の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・192
8.3 COMPUTE 句と COMPUTE BY 句 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・193
複数の COMPUTE BY 句の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・195
複数の集計値の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・196
総計の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・197
8.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・198
第 9 章 結合、サブクエリ、ユニオン
199
9.1 テーブルの結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・199
クロス結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・200
内部結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・201
左外部結合、右外部結合、完全外部結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・203
自己結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・205
2 つ以上のテーブルの結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・206
17
目次
9.2 サブクエリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・207
サブクエリと IN および NOT IN の併用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・208
相関サブクエリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・209
EXISTS および NOT EXISTS とサブクエリの併用 ・・・・・・・・・・・・・・・・・・・・・・・・・・211
ANY キーワードと ALL キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・213
9.3 ユニオンと UNION 演算子 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・216
9.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・218
第 10 章 ビューの作成と使用
219
10.1 ビューを使用する理由 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・219
一貫したデータ表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・220
複雑さの隠蔽 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・220
10.2 ビューの作成と使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・220
ビューを使用したデータ選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・222
ビューを使用したデータ修正 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・223
ビューの修正と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・225
10.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・227
第 11 章 テキストとイメージ
229
11.1 テキストとイメージを扱うステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・229
SET TEXTSIZE ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・230
READTEXT でテキスト列を読み取る方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・230
テキスト列の一部を UPDATETEXT で変更する方法 ・・・・・・・・・・・・・・・・・・・・・・・・232
WRITETEXT でテキスト列を書き込む方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・234
11.2 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・235
第 12 章 CUBE オペレータと ROLLUP オペレータ
12.1 CUBE オペレータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・237
行数の計算 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・239
GROUPING 関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・239
12.2 ROLLUP オペレータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・241
結果の分析 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・242
集計行の抽出 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・242
12.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・243
18
237
目次
第 13 章 カーソル
245
13.1 カーソルとは ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・246
カーソルタイプ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・246
カーソルの所在 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・248
カーソルの使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・249
13.2 DECLARE CURSOR ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・250
FOR UPDATE OF 句 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・251
ロック方針の選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・251
カーソルの有効範囲の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・252
SQL-92 構文でのカーソル宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・253
13.3 OPEN ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・253
カーソルを非同期に作成する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・254
13.4 FETCH ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・254
絶対フェッチと相対フェッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・255
変数へのフェッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・256
カーソルの境界の検出 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・256
13.5 CLOSE ステートメントと DEALLOCATE ステートメント ・・・・・・・257
13.6 カーソル変数の使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・258
13.7 カーソルを介した更新 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・259
@@error グローバル変数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・260
13.8 CURSOR_STATUS( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・261
13.9 カーソルのレポートを表示するストアドプロシージャ ・・・・・・・・・・・・・・・262
13.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・263
第 14 章 管理者用の Transact-SQL
265
14.1 サーバーの設定とデータベースオプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・266
サーバーオプションの変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・266
データベースオプションの変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・267
14.2 DBCC ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・267
DBCC USEROPTIONS ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・267
DBCC CHECKDB ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・269
DBCC DBREINDEX ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・270
DBCC (FREE) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・271
DBCC SQLPERF (LOGSPACE) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・271
DBCC PERFMON ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・272
19
目次
DBCC SHOW _STATISTICS ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・273
DBCC SHOWCONTIG ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・274
14.3 ジョブのセットアップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・274
ジョブの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・275
ジョブにジョブステップを追加する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・276
ジョブの手動実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・277
ジョブのスケジュールの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・278
14.4 バックアップと復元 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・280
FundAccts データベースのバックアップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・280
FundAccts データベースの復元 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・281
14.5 その他の管理作業 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・282
UPDATE STATISTICS ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・283
SQL Server の起動 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・284
SQL Server エージェントの開始 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・285
SQL Server のシャットダウンと一時停止 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・285
プロセスの終了 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・286
14.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・287
第 15 章 ストアドプロシージャとトリガ
15.1 グローバル変数とローカル変数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・290
DECLARE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・290
変数値の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291
変数値の取得 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291
15.2 フロー制御ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291
IF...ELSE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・292
BEGIN...END ブロック ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・293
PRINT ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・294
CASE 式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・295
WHILE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・296
CONTINUE と BREAK ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・297
GOTO ステートメントと RETURN ステートメントによる分岐 ・・・・・・・・・・・・298
WAITFOR ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・299
RAISERROR ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・300
一時テーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・302
20
289
目次
15.3 独自のストアドプロシージャの記述 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・302
CREATE PROCEDURE によるプロシージャの作成 ・・・・・・・・・・・・・・・・・・・・・・・・303
パラメータと戻り値 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・304
プロシージャを使用する権限の付与 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・306
ストアドプロシージャの呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・306
やや高度なプロシージャの例 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・308
15.4 プロシージャの修正と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・310
ALTER PROCEDURE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・310
DROP PROCEDURE によるプロシージャの削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・311
15.5 トリガ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・311
CREATE TRIGGER ステートメントによるトリガの作成 ・・・・・・・・・・・・・・・・・・・312
トリガの修正と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・315
15.6 拡張ストアドプロシージャの概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・315
SQL Server 拡張ストアドプロシージャの使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・316
独自の拡張プロシージャの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・317
15.7 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・318
第 16 章 トランザクション
319
16.1 Transact-SQL のトランザクション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・321
BEGIN TRANSACTION ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・322
SET IMPLICIT _TRANSACTIONS ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・322
COMMIT による変更の保存 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・323
ROLLBACK による変更の取り消し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・323
SAVE TRANSACTION ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324
16.2 分散トランザクション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324
Microsoft 分散トランザクションコーディネータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・324
BEGIN DISTRIBUTED TRANSACTION ステートメント ・・・・・・・・・・・・・・・・・325
暗黙的な分散トランザクション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・326
16.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・326
第 17 章 SQL Server イベントの監視
329
17.1 SQL Server プロファイラ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・329
プロファイラの用語 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・330
トレースの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・333
トレースの開始と停止 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・335
21
目次
トレース結果の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・336
17.2 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・336
第
3
部
SQL Server プログラミング
第 18 章 DB-Library
341
18.1 サンプルプログラムのアーキテクチャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・342
DBObject クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・342
ストアドプロシージャの結果が表示されたビューの使い方 ・・・・・・・・・・・・・・・・・・343
18.2 DB-Library の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・344
ストアドプロシージャとパラメータの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・345
カーソル内の特定位置での更新 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・346
18.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・347
第 19 章 ODBC
349
19.1 ODBC API の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・350
19.2 ストアドプロシージャの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・351
19.3 カーソルの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・352
19.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・354
第 20 章 ADO
357
20.1 ADO オブジェクトモデル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・357
20.2 ADO オブジェクトの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・359
20.3 ストアドプロシージャの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・361
20.4 カーソルの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・361
20.5 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・363
第 21 章 ODS
21.1 ODS API の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・366
21.2 メッセージを記録するプロシージャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・367
21.3 メッセージを読み取るプロシージャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・369
21.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・370
22
365
目次
第
4
部
付録
付録 A
CD-ROM の内容
373
付録 B
FundAccts サンプルデータベース
381
付録 C
SQL Server の SET ステートメント
387
付録 D
関数
391
付録 E
予約キーワード
403
付録 F
システムストアドプロシージャ
405
付録 G
システムデータベースとテーブル
421
付録 H
演算子リファレンス
425
付録 I
データ型リファレンス
427
付録 J
SQL Server 7.0 の技術仕様
431
付録 K
sp_confgure と sp_dboption のオプション
433
付録 L
ファイルとディレクトリの構成
437
付録 M
データ変換サービスウィザードの使用方法
439
索 引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・445
23
第
1
章
SQL Server
プログラミング環境の概要
この章で学習すること
◆ SQL Server を構成するコンポーネント
◆ データベースに含まれるオブジェクト
◆ SQL Server 7.0 に付属するユーティリティ
◆ 文字セットと並べ替え順
◆ アプリケーションを SQL Server データベースに接続するためのデータベースイ
ンターフェイス
SQL Server というデータベースアプリケーションは、システムアナリスト、データベース管
理者、システム管理者、プログラマ、プロジェクトマネージャといった人々の努力の結晶とし
て生み出されたものである。こうした人々は、ビジネス上の問題を技術的なソリューションに
転換する責任を負っている。
技術的なソリューションを開発するには、次のような作業が必要になる。
●
データベースの設計( テーブルや列の定義)
●
サーバーでのアプリケーションの処理部分に関するストアドプロシージャ群の定義
●
テーブル制約やテーブル間のリレーションの設定
●
ユーザー、ロール、権限の設定
●
保守計画の設定( バックアップ、復元の手順も含む)
●
クライアントアプリケーション用のデータベースインターフェイスの選択
●
データベースを使用するクライアントアプリケーションソフトウェアの開発
実際のリストはもっと長くなるが、このリストを見れば、いかに多大な努力が必要かという
ことがわかるだろう。データベースインターフェイスは、クライアントアプリケーションがデー
タベースにアクセスするための入り口であり、おもに 2 つのコンポーネントから構成される。
その 1 つは呼び出しレベルインターフェイス( CLI )で、もう 1 つはこのインターフェイス上で
使用される言語である。
データベースアプリケーションは、CLI を使用することで、データベースから一連の行( 行
27
第1章 SQL Server プログラミング環境の概要
セット)を取り出し、それらの行に含まれるデータを処理する。アプリケーションによっては、
取り出した行セットに何度もアクセスしたり、何らかのアクションを実行する前に行セットを
前方や後方にスクロールして各行を検査することもある。
注 ここで使用している「呼び出しレベルインターフェイス」という用語は、アプリケーションがデータベース
にアクセスし、そこに含まれるデータやその他のオブジェクトを操作するために使用するあらゆる方法ま
たは技術のことを指す。多くの場合(特に本書の第 3 部で紹介するサンプルの場合)、このデータベースア
クセス技術は DB-Library などのアプリケーションプログラミングインターフェイス( API )を使用する。
SQL 標準定義における呼び出しレベルインターフェイスの代表例は ODBC である。
さらに、データベースアプリケーションは、データベース内のデータを変更したり、新しい
行を追加したり、不要になった行を削除したりするときにも CLI を使用する。
データベースアプリケーションでどのような処理を実行するときでも、データベースとのやり
とりは CLI が行うことになる。CLI は、プログラムのデータベースサービス要求を SQL Server
に渡し、その処理結果をプログラムに返すための導管と考えることができる。
プログラムから SQL Server に渡すデータベースサービス要求は、SQL Server の理解できる
言語で書かなければならない。この言語がデータベースインターフェイスの 2 番目のコンポー
ネントであり、SQL Server に実行させる処理はすべてこの言語で記述する必要がある。つまり
この言語を使用して、行セットの取り出し、行の追加や削除といったデータベース処理を記述
することになる。
SQL Server 環境で使用される言語は Transact-SQL というものであり、これが本書のおもな
テーマである。第 3 部では、使用可能ないくつかの CLI オプションとその使用方法について学
習する。
以降の節では、データベースアプリケーションを機能させる SQL Server プログラミング環境
とコンポーネントの概要について見ていくことにする。
1.1 SQL Server 環境のコンポーネント
アプリケーションを実装する SQL Server 環境は、データベースサーバーとして使用されるマ
シン上にインストールされたいくつかのオペレーティングシステムサービスから構成される。
これらのサービスは、SQL Server の管理と、クライアントからのさまざまなデータ要求の処理
を担当する。
図 1-1 に、SQL Server 環境の簡単な概念図を示す。このうちいくつかのオブジェクトは実際
にプログラミングプロジェクトの中で扱うことになる。
SQL Server がデータベース内で管理するオブジェクトは、データが格納されるテーブルだけ
ではない。データの整合性を維持するには、データ入力のルールを確立し、ユーザーがデータ
入力時にデータ項目を指定しなかった場合に使うデフォルト値を定義する必要がある。さらに、
データベース内のテーブル間に確立されたリレーションを常に有効に保たなければならない。
28
1.1 SQL Server 環境のコンポーネント
図 1-1 SQL Server 環境を構成するコンポーネントの概念図
こうしたデータ関連の情報に加えて、データの処理と取得に関連するオブジェクト( ビュー
やストアドプロシージャなど)とトリガと呼ばれるイベント機構も格納する必要がある。
SQL Server
データサービス要求とその要求の結果は、クライアントマシンとデータベースサーバーマシ
ン上の SQL Server を結ぶネットワーク接続を介して送信される。データに対する要求は、クラ
イアント上にインストールされた SQL Server クライアントツールから出されることも、本書の
第 3 部で学習するような任意の SQL Server アプリケーションから出されることもある。別の
SQL Server 上で実行されているプロシージャからデータ要求が出されることもある。
SQL Server は Windows NT サービスの集まりであると考えられ、マルチユーザー環境でデー
タを管理するために使用される DLL 、データベースオブジェクト、ストアドプロシージャをサ
ポートしている。
29
第1章 SQL Server プログラミング環境の概要
注 SQL Server 7.0 は、Windows NT のほかに Windows 9x の環境でも実行できる。本書では、SQL
Server 7.0 を Windows NT Server 4.0 上で稼動する状況だけを想定している。オペレーティングシス
テムのアーキテクチャ上の違いや、SQL Server をサポートするしくみの違いなどはあるが、本書で扱う
Transact-SQL の動作は、基本的にどのプラットフォームでも同じである。
SQL Server のおもなコンポーネントの 1 つは SQL Server クエリプロセッサである。このプ
ロセッサは、Transact-SQL ステートメントに基づいて、目的の結果を効率的な方法で得るため
の具体的な実行プランを立てる。
この処理の例として、投資信託アカウントデータベース内のアカウント( Accounts )テーブルか
ら口座番号( acct_no )、口座名( acct_lastname )、郵便番号( zip )、自宅の電話番号( home_phone )
を取得するクエリについて考えてみよう。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 このデータベースの構造については付録 B を参照
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
これらの列をテーブル内のすべての行から取り出すのではなく、state=“ CT ”の条件を満たし、
郵便番号が 06100 から 06300 までの範囲に含まれる行だけを取り出すことにする。
この Accounts テーブルには 3 つのインデックスが定義されている。1 番目のインデックスは
zip 列の値にインデックス付けをして、2 番目のインデックスは state 列、3 番目のインデックス
は state 列と zip 列の両方にインデックス付けをするものとする。
このクエリを SQL Server に発行したときに、SQL Server はどのような処理をして結果セッ
トを作成するか、また、クエリプロセッサにはどのような選択肢があるか、という点について
考えてみよう。具体的には、次のような選択肢がある。
1
テーブル内の各行をスキャンして、zip 列と state 列の値が選択基準を満たすかどうかを
テストする。使用可能なインデックスがまったくない場合にはこの方法が採用される。
2
state インデックスを選択し、このインデックスに含まれるすべての“ CT ”行を取り出し
た後で、その 1 つ 1 つの行について zip 列の値を選択基準と比較する。
3
zip インデックスを選択し、zip の値が 06100 から 06300 の範囲に含まれる行を取り出し
た後で、その 1 つ 1 つの行について state 列の値が“ CT ”に等しいかどうかをテストする。
4
state インデックスを選択して“ CT ”の項目をスキャンし、zip インデックスを選択して
06100 から 06300 までの値を持つ項目をスキャンした後で、インデックスデータアドレ
スが一致するデータ行を取り出す。
5
state 値と zip 値の両方を含むインデックスを選択し、それらの項目が選択基準を満たす
かどうかをテストする。これはクエリプロセッサが最も選択しやすい方法である。本書
で示す例を見れば、クエリプロセッサが期待に違わぬ働きをしてくれていることがわか
るだろう。
30
1.1 SQL Server 環境のコンポーネント
このシナリオからわかるように、クエリプロセッサの仕事は決して単純なものではない。ク
エリが発行されたときには、その結果を得るためにいくつもの方法が考えられる。クエリプロ
セッサは、クエリオプティマイザの内部アルゴリズムとクエリがコンパイルされたときのデー
タ統計に基づいて、いくつも方法の中から最も効率的なものを選択する。
クエリプロセッサが各クエリを処理するときには 2 つのフェーズがある。Transact-SQL ス
テートメントを正規化された形式へと解析するプロセスは解決と呼ばれ、実行プランを立てる
プロセスはコンパイルと呼ばれる。
たとえばストアドプロシージャを作成するときは、SQL Server はそのプロシージャ内の
Transact-SQL ステートメントの構文が正しいかどうかを検証し、そのプロシージャを正規化さ
れた形式に変換する( これはさらに sysprocedures システムテーブルに格納される)
。
ストアドプロシージャを実行するときは、SQL Server が sysprocedures テーブルから正規化さ
れた形式を読み取って、それを解決フェーズで処理する。解決フェーズの間に、このプロシー
ジャから参照されるオブジェクトが存在しているかどうかと、参照される列の型とプロシージャ
変数の間でデータ型の互換性があるかどうかがテストされる。
解決フェーズが正常に完了した後は、現在のデータベース統計に基づいて、プロシージャ内
のクエリ( またはクエリ群)をどのように実行するかが検討される。このプロセスの結果が実
行プランであり、これは現在の( および後続の)実行要求に備えてプロシージャキャッシュ内に
キャッシュされる。
SQL Server が実行プランを立てるときには、どのような統計情報を参考にするのだろうか。
オプティマイザが考慮する要因の 1 つは、参照されるテーブル内の行数である。もう 1 つの要
因は、使用可能なインデックスがあるかどうかと、そのインデックスにおけるキーの分布であ
る。インデックスを効率的に使用するには、クエリの実行方法に影響を与える部分、つまり
Transact-SQL ステートメントの WHERE 条件や GROUP BY 句、ORDER BY 句などをオプティ
マイザが評価しなければならない。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 オプティマイザが処理を正しく行うためには、データベース統計を常に最新の状態に保つことが重要で
ある。第 14 章では、インデックスにおけるキー分布の統計情報を更新する UPDATE STATISTICS
ステートメントについて学習する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
データベースとデータベースオブジェクト
SQL Server データベースは、2 つ以上のオペレーティングシステムファイルから構成される。
少なくとも、データベースオブジェクトを格納するファイルと、データベースアクティビティの
ログを記録するファイルが存在する。オブジェクトはメインのプライマリファイルに格納され
るが、入りきらない場合には 1 つまたは複数のセカンダリファイルに格納される。SQL Server
は、これらのファイルをページと呼ばれる 8KB のブロック単位で読み書きする。
ファイルを構成するページ群には、ファイルの最初のページを 0 として、順に番号が割り当
31
第1章 SQL Server プログラミング環境の概要
てられる。SQL Server がデータベース内のページの場所を指すときには、そのページを格納し
ているファイルを示すファイル ID と、ファイル内でページを特定するページ番号を使用する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 データベースファイルのサイズは、データベース内に格納するオブジェクトに応じて変化する。これら
のファイルがどのように割り当てられているかについては、第 5 章の CREATE DATABASE ステー
トメントに関する部分で学習する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
データベース内に格納されるオブジェクトとしては、テーブル、インデックス、ストアドプ
ロシージャ、トリガ、ルール、権限、ビュー、デフォルト、ユーザー定義データ型がある。
表 1-1 に、SQL Server データベースに格納されるオブジェクトの概要を示す。
表 1-1 SQL Server データベースオブジェクト
データベースオブジェクト
テーブル
説明
データベースアプリケーションで扱う対象になる
「もの」
( エンティティ)
に関
するデータを格納するために使われる。各エンティティは、テーブル内の行
(またはレコード)
として表現される。エンティティの共通属性はテーブルの列
( またはフィールド)
として表現される。
インデックス
テーブルの行へのアクセス効率を高めるために使われる。各インデックス項目
は、1 つまたは複数のキー値と、これらの値を含むテーブル内の行を指すポイ
ンタから構成される。SQL Server のインデックスには、クラスタ化されたも
のとそうでないものがある。
ストアドプロシージャ
Transact-SQL ステートメントの集まりに名前を付けて、1 つの単位として実
行できるようにしたもの。
トリガ
テーブル内の指定のデータが修正されたときに呼び出される特殊なストアド
プロシージャ。
ルール
特定のテーブル列に入力される値についての詳細記述またはステートメント。
権限
あるステートメントを実行したり、あるオブジェクトに対してアクセスしたり
する許可をユーザーまたはグループに与えるときに使われる。
ビュー
1 つまたは複数のベーステーブル
(あるいは別のビュー)
から取り出された列に
よって構成される仮想テーブル。
デフォルト
ある列の値が指定されていない行をテーブルに挿入するときに、SQL Server
がその列に割り当てる特定の値。
ユーザー定義データ型
基本の SQL Server データ型のほかにユーザーが独自に定義するデータ型。こ
のようなデータ型を一度 SQL Server に定義しておけば、ほかのデータ型と同
じように使用することができる。
テーブル
テーブルは、データベースアプリケーションが扱う対象のもの( エンティティ)を表すオブ
ジェクトである。たとえば第 4 章で学習する信託アカウント管理アプリケーションの場合は、
顧客口座、顧客の信託アカウント、信託アカウントに対する取引、定期的に顧客向けに発行す
る報告書などのエンティティを扱うことになる。
信託アカウント管理の分野で表現できるエンティティはほかにもあるが、このアプリケーショ
32
1.1 SQL Server 環境のコンポーネント
ンで必要とされるのは、このアプリケーションの意図する目的を支えるエンティティだけであ
る。信託アカウントデータベース内には、これらのエンティティに関するデータを格納するた
めに、1 つまたは複数のテーブルオブジェクト( テーブル)を用意する。
テーブルは、特定のエンティティのデータを格納するために使われる。テーブルはいくつか
の行(またはレコード)から構成され、最大で 8,050 バイトのデータを格納することができる(テ
キスト列やイメージ列は含まれない)
。
テーブルの行はいくつかの列から構成される。各列にはデータ型が定義されている。各列に
は、データ型のほかにも名前や制約といった属性がある( 制約とは、使用可能な値およびほかの
テーブルとの関係を定義する決まりのこと)
。列の詳細については、第 5 章の CREATE TABLE
ステートメントに関する部分で学習する。
インデックス
テーブルからデータを取り出すプロセスを効率化するために、データベースではいくつかの
インデックスを作成する場合がある。インデックスには、テーブルの 1 つまたは複数の列に基
づくキー値と、そのキー値を含むデータ行を指すポインタが含まれる。
インデックス内の特定のキーが参照する行の数は、そのインデックスが一意か一意でないか
によって異なる。
一意なインデックスには、テーブル内の 1 つのデータ行だけを指すキーが含まれる。一意な
インデックスを使用する場合は、そのインデックス付きの列にはテーブル内の各行でそれぞれ
異なる値が格納されていることになる。つまり、テーブル内の 2 つの行がそのインデックス付
きの列に同じ値を格納することはありえない。
一意なインデックスは、テーブルの主キー( PRIMARY KEY )として設計された列に作成され
る。主キーとは、テーブル内の行を一意に識別するために使われる 1 つまたは複数の列から構
成されたキーのことである。たとえば、顧客が個人の場合には、顧客の電話番号を顧客テーブ
ルの主キーとして使用することがある。
一意でないインデックスには、1 つまたは複数の行を指すキーが含まれる。一意でないイン
デックスは、行を識別する目的には使われない。このインデックスは、一般的には、テーブル
に含まれる一部の行に迅速にアクセスするために使われる。顧客テーブルで使用される一意で
ないキーの代表例は、顧客の住所に含まれる郵便番号である。テーブル内での郵便番号の分布
によっては、同じ郵便番号がいくつもの行( 場合によっては数百行)に現れることがある。
どの列をインデックスにするかは、アプリケーションから SQL Server に発行するクエリの内
容によって決まってくる。インデックス列を決めるときは、クエリ処理とテーブル更新処理の
バランスを考えなければならない。
インデックスを使用するとクエリの実行速度が速くなるが、インデックス列の値が変更され
たり、行が追加または削除されたりするたびに、インデックスを更新しなければならない。イ
ンデックスの更新処理の負荷が大きくなると、更新操作のパフォーマンスに悪影響が出るおそ
れがある。そこで、クエリ速度と更新速度のどちらがアプリケーションにとって重要なのかを
考える必要が出てくる。
33
第1章 SQL Server プログラミング環境の概要
どちらを優先すべきかは、アプリケーションによって異なる。この点は、データベースの設
計方法や、アプリケーションからデータベースを使用する方法にも影響を与える。インデック
スを使用するときは、Transact-SQL プログラミングのあらゆる側面において慎重に検討する必
要がある。
インデックスは、B ツリーと呼ばれるデータ構造を使用して実装されている。インデックス
ツリーのルートレベルには、さまざまなインデックス値の範囲が格納される。このページのそ
れぞれの範囲項目は、ツリーの下層にあるほかのページを指している。下層のページになるほ
ど狭い範囲の値を格納することになり、ツリーの最下層はリーフレベルと呼ばれる。
リーフレベルのページには、キー値とそれらの値を含むテーブル内の行を指すポインタが格
納される( クラスタ化インデックスの場合は、行そのものが格納される)
。リーフページのアー
キテクチャは、インデックスの種類( クラスタ化インデックスか非クラスタ化インデックスか)
によって異なる。
●
非クラスタ化インデックス ― インデックス項目の並べ替え順に基づいて、テーブルの行の
論理的順序を決定する。テーブル内の物理的な行の順序は、非クラスタ化インデックスの
影響を受けない。
●
クラスタ化インデックス ― テーブルの行の物理的な順序を決定する。クラスタ化インデッ
クスのリーフページは、ディスクのどこかに格納されているデータページへのポインタで
はなく、テーブルの実際のデータページを格納している。
行の物理的な順序はクラスタ化インデックスによって決定されるので、1 つのテーブルには
クラスタ化インデックスを 1 つしか定義できない。テーブルに PRIMARY KEY 制約を定義す
るときに、そのキーのインデックスの種類が指定されず、かつクラスタ化インデックスがまだ
そのテーブルに存在しない場合は、その主キーに関してクラスタ化インデックスが作成される。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 PRIMARY KEY 制約については第 5 章で学習する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
クラスタ化インデックスが存在しない場合は、非クラスタ化インデックス内のポインタ項目
は対応するテーブル行の場所を指す。クラスタ化インデックスがテーブル内に存在する場合は、
非クラスタ化インデックス項目はクラスタ化インデックス内のクラスタキーを指す。ここでデー
タ行ではなくクラスタ化インデックスを指す理由は、インデックスページが分割されたときの
システムのパフォーマンスを改善するためである。
このしくみにより、以前のバージョンの SQL Server よりもパフォーマンスの向上が見られる
ようになった。以前のバージョンでは、インデックスページに行のキーが挿入されてページが
いっぱいになったときは、そのページを 2 つに分割しなければならなかった。元のページから
新しいページへとキーが移されるために、どちらのページもかなりの項目を扱うことになった。
クラスタ化インデックスでこのような分割が発生した場合には、実際のデータ行がページか
らページに移されていた。非クラスタ化インデックスはこれらのディスク上で移動する行を参
34
1.1 SQL Server 環境のコンポーネント
照していたので、データ行の新しい場所を反映するように非クラスタ化インデックスも更新す
る必要があった。したがって、非クラスタ化インデックスが存在する場合には、ページ分割時
にかなり大きなインデックス保守のオーバーヘッドが発生していた。
しかし、SQL Server 7.0 では、クラスタ化インデックスが存在する場合でも、非クラスタ化
インデックス項目はデータページを参照しない。その代わりに、クラスタ化インデックス内の
クラスタキーを参照する。このアーキテクチャのおかげで、インデックスページの分割が起き
ても、非クラスタ化インデックスを保守する必要はなくなった。なぜなら、非クラスタ化イン
デックスは場所に関係なくクラスタキーを参照し続けるからである。非クラスタ化インデック
スは、このクラスタキーを使用することで、クラスタ化インデックスのリーフページに格納さ
れているデータ行を探し当てる。
したがって、SQL Server 7.0 では、クラスタ化インデックスページが分割されたときでも、
非クラスタ化インデックスの保守を行わずに済む。ただし、新しい行に関する新しいクラスタ
キーを挿入する場合は例外である。ページに新しいキーを追加する余裕がないときは、非クラ
スタ化インデックス自体のページが分割される可能性がある。
ストアドプロシージャ
アプリケーション内でよく使用されるもう 1 つのデータベースオブジェクトはストアドプロ
シージャである。
ストアドプロシージャとは、1 つまたは複数の Transact-SQL ステートメントを 1 つの単位と
してコンパイルしたものである。ストアドプロシージャには、サーバー側で実行されるアプリ
ケーションロジックを実装するためのデータベース操作、変数宣言、さらにフロー制御ステー
トメントを組み入れることができる。
ストアドプロシージャは、プロシージャ内の SELECT ステートメントに基づいて複数の結果
セットを返すだけでなく、複数の引数を受け取って出力値と戻り値を返すように定義すること
ができる。
ストアドプロシージャは作成時にコンパイルされて sysprocedures システムテーブル内に保存
され、プロシージャのテキストは syscomments テーブルに保存される。このプロシージャが初
めて実行されるときは、プロシージャがテーブルから取り出され、オブジェクトの参照が解決
されて、今回または次回の実行に備えて実行プランがプロシージャキャッシュ内にキャッシュさ
れる。
ストアドプロシージャ内で参照されたオブジェクトは実行時まで解決されないので、プロシー
ジャの作成時にはまだ存在していないが実行時には存在するはずのオブジェクトをプロシージャ
から参照することができる。
SQL Server には、便利なストアドプロシージャがいくつも用意されている。これらのストア
ドプロシージャは次のカテゴリに分けられている。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 詳細は付録 F を参照
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
35
第1章 SQL Server プログラミング環境の概要
●
カタログストアドプロシージャ ― データベースと SQL Server についての情報を提供する。
これらのプロシージャは ODBC アプリケーションでも使用される。
●
拡張ストアドプロシージャ ― ストアドプロシージャ呼び出しと同じ方法で DLL 関数を呼
び出せるようにすることで、SQL Server の機能を拡張する。これらのプロシージャを利用
すると、SQL Server 内からの E メール機能を実装することもできる。
●
レプリケーションストアドプロシージャ ― レプリケーション操作を実現する。
●
SQL Server エージェントストアドプロシージャ ― アクティビティのスケジュールを管理
するために使われる。
●
システムストアドプロシージャ ― データベース内のさまざまなデータ管理作業に使われる。
アプリケーションの一部をサーバー側プロシージャとして実装すると、アプリケーション全
体のパフォーマンスを向上させ、ネットワークトラフィックを軽減させて、アプリケーション
の保守を容易にすることができる。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 第 15 章では、独自のストアドプロシージャの書き方について学習する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
ネットワークコンポーネント
クライアントマシンから SQL Server に向けて発行した Transact-SQL ステートメントを SQL
Server に処理させるには、そのステートメントをクライアントマシンとサーバーマシンの両方
のネットワークコンポーネントを介して転送しなければならない。
これらのネットワークコンポーネントは、図 1-1 に示したとおり、Net-Library 、プロセス間
通信機構( IPC )、ネットワークプロトコル、ネットワークインターフェイスカード( NIC )、物
理ネットワークから構成される。
アプリケーションの SQL 要求は、まずクライアント API( DB-Library や ODBC など)を介し
て渡される。その後で、Net-Library を介して IPC 機構に渡される。この IPC 機能が、何らかの
ネットワークプロトコルを使用してネットワーク上で要求をやりとりする。
SQL Server への接続では、どの Net-Library をロードするかをクライアント API がクライア
ント構成に基づいて決定する。ロードされた Net-Library は、API 要求を処理して、それらを下
層レベルのプロセスである IPC 機構に渡す。
ここで使用される IPC 機構は、ロードされた Net-Library とネットワークプロトコルによっ
て異なる。代表的な Net-Library と IPC を表 1-2 に示す。
図 1-1 を見てもわかるように、サーバー側にも同じネットワークコンポーネントがある。SQL
Server は名前付きパイプをデフォルトの Net-Library/IPC としてインストールするが、ほかの
Net-Library も同様にインストールすることができる。SQL Server がクライアントマシンとやり
とりするときには、インストールされているプロトコルをすべて同時に使用することができる。
SQL Server に送信される SQL ステートメントと SQL Server からクライアントに返される結
果は、表形式のデータストリーム( TDS )と呼ばれるデータストリームへとパッケージ化された
36
1.1 SQL Server 環境のコンポーネント
表 1-2 SQL Server とのやりとりに使用される Net-Library と IPC
Net-Library
IPC 機構
説明
名前付きパイプ
NetBEUI または TCP/IP
SQL Server は、既定ではYY.YpipeYsqlYquery というパイ
プ上の名前付きパイプ接続で待ち合わせます。
TCP/IP ソケット
Windows ソケット
既定ポートは 1433。
NWLink
IPX/SPX
SQL Server は、Novell Bindery サービス名を介して Novell
ネットワークに登録される。サーバーコンピュータの名前
が既定のサービス名として使われる。
マルチプロトコル
TCP/IP 、IPX/SPX 、
名前付きパイプ
統合されたセキュリティを使用することができ、暗号化が
サポートされる。
Banyan VINES
Sequenced Packet
( SPP )
Protocol
StreetTalk サービス名の項目を必要とする。
AppleTalk
ADSP
Apple Macintosh ベースのクライアントからの接続を可能
にする。Apple Talk サービスオブジェクト名の項目を必要
とする。
うえに、ネットワーク転送のために IPC プロトコルによってラップされる。
幸い、こうしたネットワークレベルで行われる一連の処理をアプリケーションプログラマが
気にかける必要はない。クライアント API のおかげで、アプリケーションとネットワークの間
に緩衝帯が設けられるので、プログラマはネットワーク上の複雑なやりとりを無視してアプリ
ケーションの処理だけに意識を集中させることができる。
クライアント側ライブラリ
SQL Server とやりとりをするプログラムをサポートするには、ODBC や DB-Library といっ
たクライアント側ライブラリをインストールしておき、プログラムが SQL Server とのやりとり
を始める前に、これらのライブラリの設定を済ませなければならない。これらの API ライブラ
リはプログラムからデータベースへのリンクであり、以前は呼び出しレベルインターフェイス
( CLI )と呼ばれていたものである。
本書の第 3 部では、さまざまな API ライブラリを使用して SQL Server サーバーにアクセス
するプログラムについて学習する。これらのライブラリの言語はプログラム側ではよく知られ
ているが、また別の側面として、特定の Net-Library とのやりとりを行う役割がある。
たとえば ODBC は、アプリケーションに必要なデータベース処理を実行するために使用でき
る一連の API 関数を公開している。具体的には、SQL Server との接続の確立、Transact-SQL ス
テートメントの発行、結果の処理などを実行するものがある。その一方で、ローカルプログラ
ムや API の後処理を扱う API 関数や、ネットワークに送信されない API 関数もある。
どのクライアント側ライブラリを選択するかはプログラマの自由である。選択を左右する要
因としては、さまざまな API 関数についての知識、使用しているアプリケーションプログラミ
ング言語の種類、API の将来性についての見通し、インストール基準、パフォーマンス要件な
どがある。
ODBC の登場以前は、DB-Library と C が最も一般的な選択肢とされていた。ODBC が登場
37
第1章 SQL Server プログラミング環境の概要
したときに、この新しい技術にすぐに切り替えた人もいたが、当時はパフォーマンスの面で多
くの問題があった。ほとんどすべてのプログラミング雑誌に、DB-Library と ODBC のパフォー
マンスを比較する記事が掲載されていた。
しかし ODBC が発展し、理解が広まるにつれて、DB-Library と C の人気はしだいに衰退し
ていった。この傾向を大きく後押ししたのは、ODBC とのやりとりを支援するデータアクセス
オブジェクト( DAO )というオブジェクト指向技術である。現在でも DB-Library の支持者は少
なくないが、こうした人々は DB-Library のパフォーマンスを強く信奉しているのである。
この分野に新たに登場したのが OLE DB という技術である。COM と OLE の到来により、現
在ではアプリケーションアーキテクチャ( オペレーティングシステムも含む)のコンポーネン
ト化が流行している。この流行は、遅かれ早かれデータベースアクセス API を淘汰することに
なるだろう。詳しくは第 3 部で学習するが、それに取って代わるのは OLE DB であると予想さ
れる。
クライアントアプリケーション
クライアントデータベースアプリケーションとは、ある問題を解決するために設計されたプ
ログラムの集まりである。こうしたプログラムは、C や C++ 、Visual Basic 、Java などの言語で
記述され、いずれかのクライアントライブラリを介して SQL Server にアクセスする。
クライアントアプリケーションで使用される Transact-SQL は、SQL ステートメントを含む
文字列の形式になっているか、ストアドプロシージャとして参照されるか、その両方の組み合
わせになる。アプリケーションのパフォーマンスは、データベースをそのアプリケーションで
使用する SQL ステートメント向けにどこまで調整できるかによって大きく左右される。そのた
め、SQL Server に対するすべての処理を注意深く検討して、SQL Server とアプリケーションを
最適な状態に調整する手順が必要になる。
Transact-SQL 言語
Transact-SQL( T-SQL )は、SQL Server がリレーショナルデータを管理するために使用する
拡張版の SQL 言語である。T-SQL は米国規格協会( ANSI )の SQL-92 標準に基づいており、そ
れを拡張して SQL Server オブジェクトを操作できるようにしたものである。T-SQL の言語仕
様は SQL Server 7.0 になって大きく変更されている。
T-SQL ステートメントは、データ定義言語、データ操作言語、データ制御言語という 3 つの
カテゴリに分けることができる。
データ定義言語( DDL )ステートメントは、SQL Server オブジェクトを定義(および作成、変
更)するときに使われる。DDL については第 5 章で学習する。第 5 章では、DDL を使用して、
アプリケーションに必要なテーブルやインデックス、ストアドプロシージャ、トリガ、ビュー
を作成する。
SQL Server 7.0 では、それまでのバージョンとは異なり、プロシージャおよびトリガ、ビュー
を変更するときにいったん破棄してから再定義する必要はなくなった。しかも、その際にこれ
らのオブジェクトの権限が保持されるので、オブジェクトを変更するときに権限を再定義しな
38
1.2 ライセンスモードと接続
くて済むようになっている。
データ操作言語( DML )ステートメントについては第 6 章で学習する。このカテゴリには、
データベースのテーブル内に格納されたデータを取得または保守するときに使われるステート
メントが含まれる。1 つまたは複数のテーブルから行セットを取り出すには SELECT ステート
メントを使用し、行を修正するには UPDATE ステートメント、テーブルから行を削除するには
DELETE ステートメント、テーブルに新しい行を追加するには INSERT ステートメントをそれ
ぞれ使用する。これらはいずれもデータ操作言語ステートメントである。
最後のデータ制御言語( DCL )ステートメントについては、第 15 章でストアドプロシージャ
の学習をするときに触れる。制御ステートメントは、SQL クエリプロセッサが実行するロジッ
クまたはアルゴリズムを表現するために使われる。このカテゴリのステートメントは、通常
のプログラミング言語のステートメントによく似ており、IF...ELSE 、BEGIN...END、WHILE 、
GOTO 、RETURN 、PRINT などがある。
T-SQL には、自作プロシージャの機能を大きく拡張してくれる関数が豊富に用意されてい
る。SQL Server 7.0 では、SUBSTRING、LEN 、REPLACE といった新しい文字列関数が追加さ
れているほかに、セキュリティやオブジェクト情報に関する関数がいくつか用意されている。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 関数については第 7 章でカテゴリ別に学習する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
1.2 ライセンスモードと接続
SQL Server には、SQL Server を実行するライセンスと、そのサーバーにアクセスするクライ
アントごとのライセンスが必要である。SQL Server をインストールするときに、管理者は同時
使用ユーザー数と接続クライアント数という 2 種類のクライアントライセンスモードのどちら
かを選択するよう求められる。どちらを選択するかによって、アプリケーションでの接続の管
理方法が変わってくる。
接続クライアント数
このモードでは、SQL Server に接続するコンピュータごとに個別のクライアントアクセスラ
イセンスが必要になる。このライセンス契約では、クライアントアプリケーションから、ある
いはその任意のクライアントアクセス( Microsoft クライアントユーティリティアクセスを含む)
から、任意の SQL Server に接続することができる。
クライアントが複数の SQL Server にアクセスする環境の場合には、接続クライアント数ライ
センスが適している。
同時使用ユーザー数
このモードでは、特定の SQL Server にクライアントアクセスライセンスを割り当てる。この
サーバーには、割り当てられたライセンスの数だけクライアントが同時接続することができる。
39
第1章 SQL Server プログラミング環境の概要
このモードで稼動するアプリケーションの場合は、接続を慎重に管理しなければならない。
使用しないときには接続をできるだけ閉じるか、閉じるように強制する必要がある。このライ
センスモードでの最も一般的なシナリオは、接続を開き、必要な処理を行い( 具体的な方法に
ついては後述)、処理が終わったら接続を閉じることである。こうすれば、サーバー側での接続
カウントに空席ができ、ほかのユーザーが使用できる状態になる。
接続をあまり長い間保持しておくと、ほかのユーザーによるアクセスが拒否されてしまい、
需要を満たすためにクライアントライセンスを追加購入しなければならなくなる。これが、ア
プリケーションでデータベースに対して何を実行するのかということを管理者が知りたがる理
由の 1 つである。
ノードベースのクライアントアクセス
SQL Server 6.0 と同様に、どちらのクライアントライセンスモードでも、ノードベースのア
クセスを使用することができる。
ノードベースのアクセスを使用すると、SQL Server は 1 つのマシンから複数の接続が要求さ
れたことを検出し、それらの接続を 1 つのクライアントライセンスのものとカウントする。
この機能によってアプリケーション側での接続管理の負担は軽くなるが、1 接続あたり 40KB
のメモリが消費されることを頭に入れておく必要がある。
1.3 文字セットと並べ替え順
文字セットは別名コードページとも呼ばれ、記号の集まりを表している。これらの記号には、
英字(大文字と小文字)
、数字、特殊文字が含まる。1 つの文字セットには 256 個の記号が含まれ
ている。最初の 128 個の記号はどの文字セットでも同じだが、残る 128 個の記号は文字セット
によって異なる。デフォルトでは、SQL Server は ISO 8859-1( コードページ 1252 )の文字セッ
トをインストールする。ただし、SQL Server 6.5 からアップグレードした場合は、前のバージョ
ンで使われていた文字セットがインストールされる。
どの文字セットを使用するかは重要な問題である。なぜなら、SQL Server が Transact-SQL
式内の文字を比較する方法や、SQL Server が有効なデータとして認識する文字は、文字セット
によって決まるからである。
SQL Server のデフォルト(既定)の並べ替え順は、大文字と小文字を区別しないアルファベッ
ト順である。したがって、state =“CT”という WHERE 句を含む SELECT クエリの場合は、state
列の値が“ CT ”に等しい行と“ ct ”に等しい行の両方が返される。
“ ct ”
この SELECT クエリに ORDER BY 句が含まれている場合でも、既定の並べ替え順では、
の行が“ CT ”の行より必ず前に来る( あるいはその逆になる)とは限らない。
サーバーとクライアントの両方で同じ文字セットと並べ替え順を使用するようにセットアッ
プしておく必要がある。
40
1.4 SQL Server のツール
1.4 SQL Server のツール
SQL Server に付属しているツール群は、SQL Server に対するクライアント接続をテストした
り、Transact-SQL ステートメントをテストしたり、SQL Server オブジェクトを管理したりする
ときに役立つ。
SQL Server のセットアッププログラムは、ユーティリティをインストールするだけでなく、
アプリケーション開発を支援するさまざまなファイルをインストールする。これらのファイル
の中には、DB-Library や ODBC 、ODS 、OLE DB を使用したアプリケーションを開発するのに
不可欠な.h ファイルおよび.lib ファイルが含まれている。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 表 1-3 に示す 32 ビットのクライアントユーティリティオプションについては、以降の節で簡単に触れ
るとともに、第 2 章で詳しく学習する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
表 1-3 クライアントツールオプション
ユーティリティ
説明
BCP
SQL Server データベースからフラットなオペレーティングシステムファ
イルへとデータをコピーする一括コピーユーティリティ。
SQL Server Enterprise Manager
SQL Server とそのオブジェクト
(デバイス、データベース、テーブルな
ど)
を管理するために使われる。
SQL Server プロファイラ
データベースアクティビティを監視するために使われる。
SQL Server クライアント
ネットワークユーティリティ
クライアントを DB-Library 接続用に設定する。
SQL Server クエリアナライザ
Transact-SQL コマンドおよびプロシージャを実行するために使われる。
このユーティリティを使用してクエリープランと SQL Server 統計を見
ることもできる。
makepipe と readpipe
SQL Server に対する名前付きパイプ接続をテストする。
BCP
一括コピープログラム( BCP )を使用すると、データベーステーブルから外部ファイルにデー
タをコピーしたり、外部ファイルからテーブルにデータをロードすることができる。
このユーティリティはコマンドラインユーティリティであり、データの処理方法を指定する
文字列引数を受け取る。
外部ソースから入手した( または別の SQL Server からエクスポートした)オペレーティング
システムファイルにデータが含まれている場合は、テスト用または製品用のテーブルをロード
するときに BCP が役に立つ。
SQL Server Enterprise Manager
このユーティリティは、企業内の複数の SQL Server を管理するために使われるグラフィカル
ユーザーインターフェイスツールである。
41
第1章 SQL Server プログラミング環境の概要
Enterprise Manager を使用すると、データベースとそのオブジェクト、ユーザーとユーザー権
限、スケジュール計画( バックアップ作業など)を作成したり、その他のユーティリティ( クエ
リアナライザなど)を呼び出すことができる。
このユーティリティ1 つですべての管理機能を実行できるので、データベース管理者が SQL
Server を管理するときにはこのユーティリティを使用するのが一般的である。
SQL Server プロファイラ
SQL Server プロファイラは、アプリケーション(またはストアドプロシージャ)から生成され
る SQL Server データベースアクティビティや別のユーティリティから実行されるスクリプトを
分析するときに非常に役立つ。
このユーティリティはデータベースアクティビティをリアルタイムで監視し、そのログを外
部ファイルに記録することができる。このログやリアルタイム追跡は、エンドユーザーへのリ
リース前にアプリケーションのパフォーマンスを調整するために利用できる。
SQL Server クエリアナライザ
クエリアナライザは、Transact-SQL ステートメントおよびプロシージャが正しく機能するか
どうかをテストするために使われる。このアナライザを使用すると、SQL Server がデータ要求
を処理する方法を示す SQL Server クエリオプティマイザのプランを見ることができる。この情
報は、アプリケーションをどのように調整すべきかを考えるときの参考になる。
1.5 データベースアプリケーションインターフェイスの詳細
SQL 標準には、アプリケーションが SQL データベースを操作するために使用する呼び出し
レベルインターフェイス( CLI )が定められている。
CLI は一連の関数から構成されており、それらをアプリケーション内から呼び出すことで、
SQL リレーショナルデータベースに接続してデータベースを操作する。
ODBC 3.5 は、このところ業界で幅広く普及しつつある CLI である。
ヒント SQL Server へのインターフェイスになる ODBC 3.5 の関数の使用方法をしっかり理解しておく
ことを強くお勧めする。このライブラリは、CLI の選択肢としては DB-Library より明らかに優
れており、その効率的な使用方法を知っている人にとっては非常に便利なものになっている。
我々がデータベースアクセスのために COM オブジェクト技術を使用するようになったとして
も、ODBC は SQL Server に対する下位レベルのインターフェイスを提供し続けると思われる。
その他のライブラリについては、本書の第 3 部で、SQL Server へのアクセスに使用できる技
術として簡単に学習する。第 3 部のサンプルアプリケーションは、この技術で実現できる機能
のほんの表面的な部分しか触れていないが、この技術を自分でさらに研究していくための基盤
にはなるはずである。
42
1.5 データベースアプリケーションインターフェイスの詳細
DB-Library
DB-Library は 32 ビットのデータベース API であり、アプリケーションプログラムがデータ
ベースとの接続を確立したり、Transact-SQL ステートメントを実行したり、結果セットを処理
したりするために使う一連の関数を提供する。
DB-Library は、第 2 章で学習するいくつかの SQL Server ユーティリティのインターフェイ
スとして今でも使用されているが、インターフェイスの選択肢という意味では、DB-Library は
ODBC と OLE DB に急速に取って代わられようとしている。DB-Library では SQL Server 7.0
用に拡張されていないうえに、いくつかの機能( 特に Unicode データを扱う機能)がサポート
されていない。それにも関わらず、DB-Library は今でも多くのアプリケーションで強力なイン
ターフェイスとして採用されている。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 第 18 章では、サンプルの DB-Library アプリケーションを C++で作成する。Visual Basic プログラ
マ用の DB-Library もあるが、本書では C++を一貫したテーマとして扱うので、それについては触れな
いことにする。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
ODBC
Open Database Connectivity( ODBC )とは、アプリケーションから一連の共通の API 関数を使
用して異種データソースにアクセスできるようにするインターフェイスを定義した仕様である。
図 1-2 に ODBC アーキテクチャの概念図を示す。このアーキテクチャには、ドライバマネー
ジャ、いくつかのドライバ( それぞれ特定のデータベースに固有)
、さらにいくつかのユーザー
定義データソースが含まれている。
このアーキテクチャのドライバマネージャというコンポーネントは、アプリケーションから
のデータベース要求を受け取って、アプリケーションがデータソース名に指定した情報に対応
する適切なドライバをロードする。ドライバマネージャはいくつかの ODBC 関数呼び出しを自
身で処理する一方で、ほかの呼び出しをドライバに渡して処理させる。
SQL Server は、クライアントマシン上にインストールできて SQL Server とのやりとりに使
われるドライバを提供する。このドライバは、アプリケーションからの Transact-SQL をデー
タソース内で指定された SQL Server データベースに渡す役割を果たす(このドライバは ODBC
3.5 の仕様に合わせて拡張されている)。SQL Server からの結果は SQL Server ドライバによっ
て処理され、要求があったときにアプリケーションに転送される。
ユーザー定義データソースは、接続先の SQL Server とデータベースを指定する。ここに特
定のネットワーク情報を指定することもある。Windows のコントロールパネルに含まれている
ODBC データソースアドミニストレータを使用すれば、データソースを簡単に作成および修正
することができる。アプリケーションからデータソース情報を内部的に提供することもできる。
その場合は、外部データソースを定義する必要はない。
SQL Server 7.0 には ODBC 3.5 ドライバが付属しているが、このドライバは一括コピーやその
43
第1章 SQL Server プログラミング環境の概要
図 1-2 ODBC アーキテクチャ
他のいくつかの新機能をサポートしている。各機能の詳細については Microsoft ODBC 3.5 SDK
を参照のこと。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 第 19 章では、ODBC データソースアドミニストレータを使用してデータソースを作成する方法と、デー
タソースを ODBC アプリケーションで使用する方法について学習する。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
OLE DB と ActiveX Data Objects
アプリケーション内で COM オブジェクトを開発しているときに、データベースアクセスが
必要な場合は、最新のデータベースインターフェイス技術である OLE DB を使用することをお
勧めする。
OLE DB の世界には、プロバイダとコンシューマという概念がある。プロバイダとは、ある
種のサービス( たとえば、特殊なデータ構造や一連の複雑なプロシージャにアクセスするなど)
を提供するプログラムのことである。一方のコンシューマとは、こうしたサービスを要求して
44
1.5 データベースアプリケーションインターフェイスの詳細
使用するプログラムのことである。
OLE DB は、プロバイダがコンシューマに対してサービスを公開する方法とコンシューマが
その結果を扱う方法を定義した仕様である。
SQL Server データベースアクセスの例で言えば、SQL Server に付属している OLE DB プロ
バイダ( プロバイダ)が、SQL Server データベースにアクセスするためのインターフェイスを
クライアントアプリケーション( コンシューマ)に提供している。
OLE DB 仕様をきちんと理解していれば、企業全体で使用できる独自のカスタムプロバイダ
を開発することも可能である。このようなプロバイダでは、OLE DB プロバイダが必要とする
標準の OLE DB インターフェイスの上に企業のビジネスルールを実装することになる。
ActiveX Data Objects( ADO )は、アプリケーションと OLE DB プロバイダの間にある COM
オブジェクトの集まりである。これらのオブジェクトは、アプリケーションが SQL Server とや
りとりをするときに、OLE DB プロバイダへの呼び出しをじかに扱う代わりの手段として使わ
れる。
ADO は SQL Server データベースを単純なモデルとして表現したものであり、Connection 、
Recordset 、Field 、Command 、Parameter 、Error といった COM オブジェクトがアプリケーショ
ン向けに公開されている( 図 1-3 を参照)
。
図 1-3 ADO オブジェクト
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 第 20 章では、ADO と OLE DB の仕様についてもっと詳しく学習するとともに、ADO を使用してデー
タベースアクセスを行うプログラムの例を示す。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
45
第1章 SQL Server プログラミング環境の概要
Open Data Services による SQL Server の拡張
Open Data Services( ODS )は、サーバー側に位置する API である。この API を使用すると、
クライアントアプリケーションが SQL Server を呼び出すのと同じ方法で呼び出せるサーバー側
プログラムを書くことができる。さらに、SQL Server からじかに呼び出されるサーバー側プロ
グラムを作成して、SQL Server の機能を実際に拡張することもできる。
サーバー上で稼動する ODS プログラムに対しては、SQL Server に対するときとまったく同
じ方法で接続したりクエリを発行することができる。このようなプログラムは ODS サーバー
と呼ばれ、SQL Server データベース(またはほかのサーバー側サービス)に対するサーバーベー
スのアクセスを可能にする。
拡張ストアドプロシージャは、SQL Server プロシージャ内から呼び出されたり、SQL Server
の拡張ストアドプロシージャを呼び出すのと同様の方法でクライアントからじかに呼び出され
たりする ODS プログラムである。
ODS を使用すると、データが共有されている( またはイベントが処理されている)企業内の
別のアプリケーションへのゲートウェイを用意することができる。たとえば、投資信託アカウ
ント管理システムにトランザクションを追加して、顧客管理システムに対するイベントを発生
させることも可能である。この顧客管理システムは、どんなファイルシステムに基づくもので
もよい。なぜなら、ODS 拡張ストアドプロシージャが投資信託 SQL Server アプリケーション
と顧客管理アプリケーションを結ぶ独自のインターフェイスを提供するからである。
ODS は、クライアントとのすべてのネットワーク通信をサポートし、リモートプロシージャ
呼び出しを使用してほかのサーバーと通信することができる。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
参照 ODS 拡張ストアドプロシージャのサンプルについては第 21 章を参照。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
1.6 サンプルプログラム
第 3 部のサンプルアプリケーションは、Visual C++ 5.0 で書かれ、Microsoft Developer Studio
Enterprise Edition で完成させたものである。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
CD参照 第 3 部で紹介するコードはすべて本書の付属 CD-ROM に収録されている。サンプルを簡単に探し
出せるように、付属 CD-ROM のディレクトリ構造は各章の構造に従っている。
付属 CD-ROM には、サンプルプログラムのほかに、本書の第 2 部で学習する Transact-SQL ス
クリプトも収録されている。
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
46
1.7 まとめ
1.7 まとめ
この章では、SQL Server 環境とそれを構成するコンポーネント群の概要を学んだ。さらに、
SQL Server データベースの構造と、データベースオブジェクトを作成、操作するために使われ
る Transact-SQL ステートメントのカテゴリについて学習した。
SQL Server にはいくつかのユーティリティが付属しているが、これらのユーティリティはデー
タベース管理者の仕事を軽減するだけでなく、プログラマにとっても便利なものである。特に
アプリケーションのテストや調整を行うときにはこれらのユーティリティが役に立つ。
プログラマにはあまり重要でないと思われがちだが、文字セットや並べ替え順、ライセンス
モードなどが SQL Server データベースアプリケーションの操作に影響を与える可能性もある。
この章では、これらのトピックの概要となぜこれらが重要であるかについても学習した。
最後に、アプリケーションで使用できる何種類かのデータベースインターフェイスについて
知るとともに、その構造を学習した。第 3 部では、まずこれらのインターフェイスライブラリ
を試してみることにする。
47
Fly UP