mcp 70-461 microsoft sql server 2012 へのクエリ 試験対策...

131
1 MCP 70 - 461 Microsoft ® SQL Server 2012 クエリ 試験対策コース エディフィストラーニング株式会社 ラーニングソリューション部

Upload: others

Post on 16-Jul-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

1

MCP 70-461:Microsoft® SQL Server 2012 へのクエリ試験対策コース

エディフィストラーニング株式会社ラーニングソリューション部

Page 2: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

2 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

目標と前提条件

目標

「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格に対応する知識を学習

前提条件

リレーショナル データベースに関する基本知識を有していること

SQL Server データベース エンジンに関する基本知識を有し、管理ツールの操作に慣れていること

Page 3: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

3 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

MCSA:SQL Server 2012SQL Server 2012 コア プラットフォーム スキルの所有を証明

2 種類の資格

MCSA (マイクロソフト認定ソリューション アソシエイト)

コア プラットフォーム スキルの所有を証明

MCSE (マイクロソフト認定ソリューション エキスパート)

卓越した IT スキルのスタンダードとして世界中で認知

多様なソリューションにわたって奥深い専門技術を実証

変わり続けるテクノロジーに対応する最先端のスキルを証明

MCSE:Data Platform大規模データ ソリューションの構築と管理のた

めの幅広いスキルセットを証明

MCSE:BusinessIntelligence

BI に関する専門スキルを証明

Page 4: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

4 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

MCSA: SQL Server 2012

SQL Server の MCP 資格に初めて挑戦される方

SQL Server 2008 で SQL Server の MCP 資格を取得している方

http://www.microsoft.com/ja-jp/learning/certification/mcsa/sql-server/default.aspx

Page 5: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

5 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

MCSE: Data Platform

SQL Server の MCP 資格に初めて挑戦される方

SQL Server 2008 で SQL Server の MCP 資格を取得している方

http://www.microsoft.com/ja-jp/learning/certification/mcse/sql-server/data-platform/default.aspx

Page 6: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

6 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

MCSE: Business Intelligence

SQL Server の MCP 資格に初めて挑戦される方

SQL Server 2008 で SQL Server の MCP 資格を取得している方

http://www.microsoft.com/ja-jp/learning/certification/mcse/sql-server/business-intelligence/default.aspx

Page 7: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

7 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

70-461 試験内容

受験対象者

SQL Server データベースの管理者、導入者、システム エンジニア、およびデータベース アプリケーションの開発者

出題範囲

1. データベースオブジェクトの作成 (24%)

2. データの操作 (27%)

3. データの変更 (24%)

4. クエリのトラブルシューティングと最適化 (25%)

所要時間

170 分

http://www.microsoft.com/ja-jp/learning/mcp/exam.aspx?cert=1&id=70-461

Page 8: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

8 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

コースの概要

第1章 データベース オブジェクトの作成

T-SQL を使用したテーブルの作成と変更

ビューの作成と変更

DML トリガーの作成と変更

第2章 データの取得と変更

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DML ステートメントによるデータの変更

第3章 関数とストアド プロシージャ

関数

ストアド プロシージャ

第4章 クエリのトラブル シューティングと最適化

クエリの最適化

トランザクション管理

エラー処理

Page 9: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

9 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

T-SQL を使用したテーブルの作成と変更

ビューの作成と変更

DML トリガーの作成と変更

Page 10: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

10 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

テーブルとは?

テーブルはデータを表形式の構造に格納

列の集まりとして定義される

各行には一意なレコードが置かれる

社員ID 部門ID 社員名 電話番号 住所 生年月日 更新日

1000 10 鈴木 和康 03-0123-0022 東京都杉並区 1972/1/11 2002/4/1

1001 11 矢嶋 聡 03-1234-0023 東京都板橋区 1978/4/3 2004/4/1

1002 11 荒木 達也 045-456-0024 神奈川県横浜市 1974/12/5 2001/4/1

1003 12 西 昭彦 03-7890-0025 東京都墨田区 1969/10/12 2003/4/1

← 行に置かれたレコード

列→

← 列名

Page 11: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

11 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

テーブル定義の基本構文

CREATE TABLE ステートメント

ALTER TABLE ステートメントによる列の追加

CREATE TABLE <スキーマ名>.<テーブル名>(<列名1> <データ型> (NULL | NOT NULL)

, <列名2> <データ型> (NULL | NOT NULL)・・

)

ALTER TABLE <スキーマ名>.<テーブル名>ADD <列名1> <データ型> (NULL | NOT NULL)

Page 12: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

12 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

システム データ型 (1/2)

カテゴリ データ型 バイト数 説明

整数

bigintintsmallinttinyint

8421

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 の整数値-2,147,483,648 ~ 2,147,483,647 の整数値-32,768 ~ 32,767 の整数値0 ~ 255の整数値

真数decimal[(p[, s])]numeric[(p[, s])]

5 ~ 17 - 10^38 +1 ~ 10^38 – 1の固定長の有効桁数と小数点部桁数を持つ数値

概数float[(n)]real

84

-1.79E + 308 ~ 1.79E + 308 の浮動小数点数-3.40E + 38 ~ 3.40E + 38 の浮動小数点数

通貨moneysmallmoney

84

-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の金額データ値-214,748.3648 ~ 214,748.3647の金額データ値

日付と時刻

datetimeoffsetdatetimeDatetime2smalldatetimedatetime

8 ~ 1086 ~ 8433 ~ 5

1年1月1日 ~ 9999年12月31日の日付とタイム ゾーン オフセットが付いた時刻データ1753年1月1日 ~ 9999年12月31日の日付と時刻データ1年1月1日 ~ 9999年12月31日の日付と時刻データ1990年1月1日 ~ 2079年6月6日の日付と時刻データ1年1月1日 ~ 9999年12月31日の日付データ0:00:00.0000000 ~ 23:59:59.9999999

非 Unicode 文字

char[(n)]varchar[(n)]varchar(max)text

0 ~ 8,0000 ~ 8,0000 ~ 2 GB0 ~ 2 GB

8,000文字以内の固定長非Unicodeデータ8,000文字以内の可変長非Unicodeデータ2,147,483,647文字以内の可変長非Unicodeデータ2,147,483,647文字以内の可変長非Unicodeデータ

Unicode 文字

nchar[(n)]nvarchar[(n)]nvarchar(max)ntext

0 ~ 8,0000 ~ 8,0000 ~ 2 GB0 ~ 2 GB

4,000文字以内の固定長Unicodeデータ4,000文字以内の可変長Unicodeデータ1,073,741,823文字以内の可変長非Unicodeデータ1,073,741,823 文字以内の可変長非Unicodeデータ

Page 13: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

13 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

システム データ型 (2/2)

カテゴリ データ型 バイト数 説明

バイナリbinary[(n)]varbinary[(n)]varbinary(max)

0 ~ 8,0000 ~ 8,0000 ~ 2 GB (または16バイト ポインタ)

8,000 バイト以内の固定長バイナリ データ8,000 バイト以内の可変長バイナリ データ2,147,483,647 バイト以内の可変長バイナリ データ

画像 image 0 ~ 2 GB (または16バイト ポインタ) 2,147,483,647 バイト以内の可変長バイナリ データ

グローバル識別子

uniqueidentifier 16 グローバルな一意識別子 (GUID) を格納するデータ型

xml xml 0 ~ 2 GB 2,147,483,647 バイト以内の可変長XMLデータ

特殊

bitcursortimestampsysnamesql_varianttablehierarchyidgeometrygeography

10 ~ 882560 ~ 8,016テーブルの定義内容による0 ~ 8920 ~ 8,060 (Undocumented)0 ~ 8,060 (Undocumented)

1 または 0カーソルへの参照を格納データベース タイムスタンプ値オブジェクト名を格納するユーザー定義データ型(nvarchar(128))int 値、binary 値、および char 値を格納できるテーブル形式のデータを格納階層内の位置情報を格納する CLR のデータ型ユークリッド座標系のデータを格納する CLR データ型球体地球座標系のデータを格納する CLR データ型

8,000 バイト以上のドキュメントや動画などのメディア ファイルは、varbinary(max) を使用

Page 14: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

14 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

計算列と PERSISTED の効果

PERSISTED とマークされた計算列

計算値をテーブルに物理的に保存し、計算列のいずれかが更新された場合、その値を更新するように指定できる

次のテーブルに StockInStore と StockInWarehouse を合計した値を持つPERSISTED とマークされた計算列 (TotalCount) を追加する

次の ALTER TABLE ステートメントを実行する

内部的にはインデックスが作成される

インデックスが不要の場合は、PERSISTED を記述しない

ALTER TABLE Inventory ADD TotalCount AS (ProductsInStore + ProductsInWarehouse) PERSISTED

Page 15: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

15 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

データ整合性

ドメインの整合性

列に格納される値が取りうる範囲を定義域(ドメイン)と呼ぶ

社員年齢は 18歳 以上 65 歳未満

性別は「男性」、「女性」の2種類

列に適正な値が格納されるように値の種類、形式、範囲、NULL 値を許容するかなどを規定する

データ型、NULL 値許容属性、CHECK 制約、DEFAULT 制約で設定

エンティティの整合性

テーブルに格納される行の一意性の保証

PRIMARY KEY 制約、UNIQUE 制約で設定

参照整合性

テーブル間の参照関係に矛盾がない状態を維持

FOREIGN KEY 制約、トリガーで設定

Page 16: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

16 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

データ整合性と制約

データ整合性 対象 制約 説明

ドメイン

整合性

列 DEFAULT INSERT ステートメントの VALUE 句に明示的な値が指定さ

れていない場合、既定値を挿入

CHECK INSERT、UPDATE ステートメント実行時に格納される値を

制限

NULL NULL 値を許可するか拒否 (NOT NULL) するかを指定

テーブル FOREIGN KEY 格納できるデータ値を同一テーブル、または外部テーブルの

指定された列に格納される値の範囲に制限

エンティティ

整合性

テーブル PRIMARY KEY 各行を一意に識別する

内部的には、インデックスが作成される

NULL 値は許可されない

列 UNIQUE 各行を一意に識別する

内部的には、インデックスが作成される

NULL 値は 1 件入力できる

参照整合性 テーブル FOREIGN KEY 格納できるデータ値を同一テーブル、または外部テーブルの

指定された列に格納される値の範囲に制限

参照されているキー値の変更時の動作が指定できる

列 CHECK 格納できるデータ値を同一テーブルの別の列にに格納される

値の範囲に制限

Page 17: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

17 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

制約の構文

PRIMARY KEY 制約

主キーとして設定し、列に重複した値が入力されないようにする

内部的に一意なクラスター化インデックスが作成される

FOREIGN KEY 制約格納できるデータ値を同一テーブル、または外部テーブルの指定された列に格納される値の範囲に制限

DEFAULT 制約列に既定値を格納

ALTER TABLE <テーブル名>ADD CONSTRAINT <制約名> FOREIGN KEY (<列名>)REFERENCES <テーブル名> (<列名>)

ALTER TABLE <テーブル名>ADD CONSTRAINT <制約名> PRIMARY KEY CLUSTERED (<列名1>, <列名n>))

ALTER TABLE <テーブル名>ADD CONSTRAINT <制約名> DEFAULT (<既定値>))

Page 18: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

18 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

参照整合性

PRIMARY KEY 制約と FOREIGN KEY 制約により実装

部門ID

部門名

社員ID

部門ID

上司ID

社員名

電話番号

E メール

更新日

部門 社員

PK PK

FK

FK自己テーブル参照

1

2外部テーブル参照

Page 19: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

19 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

制約の定義例

CREATE TABLE [部門](

[部門ID] int IDENTITY(1,1) NOT NULL

,[部門名] nvarchar(50) NOT NULL

CONSTRAINT [PK_部門] PRIMARY KEY CLUSTERED ([部門ID]) )

GO

CREATE TABLE [社員](

[社員ID] int IDENTITY(1000,1) NOT NULL

,[部門ID] int NOT NULL

,[上司ID] int NOT NULL

,[社員名] nvarchar(50) NOT NULL

,[電話番号] nchar(12) NOT NULL

,[Eメール] nvarchar(125) NOT NULL

,[生年月日] date NOT NULL

,[更新日] datetime NOT NULL CONSTRAINT [DF_社員_更新日] DEFAULT(GETDATE()),

CONSTRAINT [PK_社員] PRIMARY KEY CLUSTERED ([社員ID])

,CONSTRAINT [UQ_社員] UNIQUE ([Eメール]))

GO

ALTER TABLE [社員]ADD CONSTRAINT [FK_社員_上司] FOREIGN KEY([上司ID])

REFERENCES [社員]([社員ID])

GO

ALTER TABLE [社員]ADD CONSTRAINT [FK_社員_部門] FOREIGN KEY([部門ID])

REFERENCES [部門]([部門ID])

GO

Page 20: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

20 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q1:PRIMARY KEY 制約

問:Customers テーブルは複数のソース テーブルから顧客データをインポートする。ここで Customers テーブルの各行が一意であることを保証したい

次の CREATE TABLE ステートメントを実行する

SourceID CustID Name

1 121 鈴木 和康

2 7856 矢嶋 聡

2 7859 荒木 達也

1 122 西 昭彦

CustID (PK) Name

121 鈴木 和康

122 西 昭彦

CustID (PK) Name

7856 矢嶋 聡

7859 荒木 達也

Customers

CREATE TABLE Customers (SourceID int NOT NULL,CustID int NOT NULL,Name nvarchar(255) NOT NULL,CONSTRAINT PK_Customers PRIMARY KEY CLUSTERED (SourceID, CustID))

Page 21: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

21 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q2:FOREIGN KEY 制約

テーブル間の参照整合性を設定する

問:Orders テーブルの CustomerID が Customers テーブルのCustomerID の値の範囲であることを保証したい

次の ALTER TABLE ステートメントを実行する

ALTER TABLE OrdersADD CONSTRAINT FX_Order_CusomerID FOREIGN KEY (CusomerID)REFERENCES Cusomers (CusomerID)

Page 22: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

22 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

一意な値の発行

IDENTITY プロパティによる整数値の発行

IDENTITY (シード値、増分値)

列のプロパティとして設定

引数で指定されたシード値から開始し、以降、増分値を加算した値を発行

NEWID() 関数による GUID 値の発行

uniqueidentifier 型に GUID 値を格納

ネットワーク上のサーバー間で複製されるテーブルの一意性を確保

SEQUENCE オブジェクト

NEXT VALUE FOR <シーケンス名> でシーケンス値を取得

CREATE TABLE Sales.受注(

受注ID int NOT NULL IDENTITY(1,1)

,製品ID int NOT NULL

,数量 smallint NULL,rowguid uniqueidentifier NOT NULL

CONSTRAINT DF_rowguid DEFAULT (newid() WITH VALUES)

)

CREATE SEQUENCE <オブジェクト名> AS <整数型>START WITH <初期値>INCREMENT BY <増分値>MINVALUE <最小値> MAXVALUE <最大値>(CYCLE | NO CYCLE)

UPDATE <テーブル名> SET <列名> = NEXT VALUE FOR <オブジェクト名>

Page 23: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

23 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q3:GUID 値を発行する DEFAULT 制約

NEWID() 関数

GUID (グローバル一意識別子) として機能する 16 バイトの 2 進数値(Uniqueidentifier 型) を発行する

問:既存データを格納している Accounts テーブルに、新規データが挿入された時、GUID 値を生成し、格納するための列としてAccountGUID を追加したい

次の ALTER TABLE ステートメントを実行する

ALTER TABLE dbo.AccountsADD AccountGUID Uniqueidentifier NOT NULLCONSTRAINT DF_AccountGUID DEFAULTNEWID()WITH VALUES

Page 24: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

24 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q4:SEQUENCE を使用した連番の発行

問:100 人の生徒情報を格納している Students テーブルに Class 列が追加された。その列に 1 から 10 の値を 1 ずつ増分しながら、循環させて格納したい

次の CREATE SEQUENCE と UPDATE ステートメントを実行する

CREATE SEQUENCE CLASS_Sequence AS intSTART WITH 1INCREMENT BY 1MINVALUE 1 MAXVALUE 10CYCLE

UPDATE Students SET CLASS = NEXT VALUE FOR CLASS_Sequence

Page 25: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

25 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

SQL Server のインデックス

クラスター化インデックス

テーブルに 1 個

リーフノードには、インデックス付けされた列の値に基づきソートされたデータ行を格納

非クラスター化インデックス

テーブルに 999 個まで

リーフノードには、データ行へのポインタ (行識別子:RID) を格納

但し、既にクラスター化インデックスがある場合は、クラスター化インデックスのキー値を格納

一意なインデックスの作成では、UNIQUE キーワードを指定する

インデックス キーのサイズと複合インデックス列の数の制約

キー列の最大サイズ 900 バイト、16 列まで

PRIMARY KEY 制約を設定した列

他の列にクラスター化インデックスが存在しない場合

自動的に一意のクラスター化インデックスが作成される

他の列にクラスター化インデックスが存在する場合

一意の非クラスター化インデックスが作成される

CREATE CLUSTERED INDEX <インデックス名> ON <テーブル名>(<列名>,・・)

CREATE INDEX <インデックス名> ON <テーブル名>(<列名>,・・)

Page 26: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

26 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

680 FR-R92B-58 Black ・・・

706 FR-R92R-58 Red ・・・

707 HL-U509-R Red ・・・

708 HL-U509 Black ・・・

709 SO-B909-M White ・・・

・・ ・・・ ・・・ ・・・

710 SO-B909-L White ・・・

711 HL-U509-B Blue ・・・

712 CA-1098 Multi ・・・

713 LJ-0192-S Multi ・・・

714 LJ-0192-M Multi ・・・

・・ ・・・ ・・・ ・・・

715 LJ-0192-L Multi ・・・

716 LJ-0192-X Multi ・・・

717 FR-R92R-62 Red ・・・

718 FR-R92R-44 Red ・・・

719 FR-R92R-48 Red ・・・

・・ ・・・ ・・・ ・・・

720 FR-R92R-52 Red ・・・

721 FR-R92R-56 Red ・・・

722 FR-R38B-58 Black ・・・

723 FR-R38B-60 Black ・・・

724 FR-R38B-62 Black ・・・

・・ ・・・ ・・・ ・・・

680 01:100

710 01:101

・・ ・・・・

715 01:102

720 01:103・・ ・・・・

680 01:141

715 01:142

・・ ・・・・

ページ:100 ページ:101 ページ:103

ページ:141

ページ:142

ページ:140

ProductID で並び替えられたデータ行

リンクリスト

ProductID

Clustered Index Seek

クラスター化インデックス

ページ:102

SELECT ProductID,ProductNumber,ColorFROM Production.ProductWHERE ProductID = 714

クラスター化インデックスの構造ProductID にクラスター化インデックスを作成した場合

生成される実行プラン

完全一致検索クエリ

Page 27: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

27 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

680 01:180

710 01:181

・・ ・・・・

715 01:182720 01:183・・ ・・・・

710 01:110:03

711 01:130:04

712 01:100:04

713 01:110:01

714 01:120:05

・・ ・・・・・・

720 01:130:02

721 01:130:01

722 01:130:05

723 01:100:01

724 01:100:02

・・ ・・・・・・

715 01:100:03

716 01:130:03

717 01:120:04

718 01:120:02

719 01:110:05

・・ ・・・・・・

680 01:171715 01:172・・ ・・・・ページ:171 ページ:172

ページ:170

ページ:180 ページ:181 ページ:182 ページ:183

ファイル番号:ページ番号

Index Seek + RID Lookup

非クラスター化インデックス

680 01:120:03

706 01:110:04

707 01:110:02

708 01:120:01

709 01:100:05

・・ ・・・・・・

SELECT ProductID,ProductNumber,ColorFROM Production.ProductWHERE ProductID = 714

RID LOOKUP

RIDファイル番号:

ページ番号:行番号

ProductID

721 FR-R92R-56 Red ・・・

720 FR-R92R-52 Red ・・・

716 LJ-0192-X Multi ・・・

711 HL-U509-B Blue ・・・

722 FR-R38B-58 Black ・・・

・・ ・・・ ・・・ ・・・

708 HL-U509 Black ・・・

718 FR-R92R-44 Red ・・・

680 FR-R92B-58 Black ・・・

717 FR-R92R-62 Red ・・・

714 LJ-0192-M Multi ・・・

・・ ・・・ ・・・ ・・・

713 LJ-0192-S Multi ・・・

707 HL-U509-R Red ・・・

710 SO-B909-L White ・・・

706 FR-R92R-58 Red ・・・

719 FR-R92R-48 Red ・・・

・・ ・・・ ・・・ ・・・

723 FR-R38B-60 Black ・・・

724 FR-R38B-62 Black ・・・

715 LJ-0192-L Multi ・・・

712 CA-1098 Multi ・・・

709 SO-B909-M White ・・・

・・ ・・・ ・・・ ・・・

ページ:100 ページ:120 ページ:130ページ:110

非クラスター化インデックスの構造ProductID に非クラスター化インデックスを作成した場合

ヒープ

生成される実行プラン

完全一致検索クエリ

Page 28: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

28 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

スキーマデータベース オブジェクトはスキーマ に置かれる

アプリケーションに対する名前空間の形成

<サーバー名>.<データベース名>.<スキーマ名>.<オブジェクト名>

スキーマ作成の基本構文

スキーマ変更の基本構文

データベース

Production Salesdbo

データベース

dbo

インスタンス

スキーマ

ALTER SCHEMA <新しいスキーマ名> TRANSFER <既存のスキーマ名>.<オブジェクト名>

CREATE SCHEMA <スキーマ名> AUTHORIZATION <所有者名>

Page 29: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

29 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

T-SQL を使用したテーブルの作成と変更

ビューの作成と変更

DML トリガーの作成と変更

Page 30: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

30 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ビューとは?

クエリにより定義される仮想テーブル

ビューが参照するベース テーブルに対するフィルターの役目をする

ベース テーブルへの直接のアクセスを許可したくない場合に使用

ビューの種類

標準のビュー

1 つ以上のベース テーブルまたは、ビューのデータを 1 つの新しい仮想テーブルに組み合わせる

インデックス付きビュー

ビューに一意なクラスター化インデックスを作成することによりビューを具体化 (永続化) する

パーティション ビュー

1 つ以上のサーバーに分散した 1 つ以上のベース テーブルを基に、行方向にパーティション分割されたデータを結合する

Page 31: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

31 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

標準のビューの定義例

社員ID 部門ID 社員名 電話番号 生年月日 更新日

1001 10 鈴木 和康 03-0123-〇△×〇 1972/1/11 2002/4/1

1002 11 矢嶋 聡 03-1234-〇☐×△ 1978/4/3 2004/4/1

1003 11 荒木 達也 045-456-△×△〇 1974/12/5 2001/4/1

1004 12 西 昭彦 03-7890-〇×△△ 1969/10/12 2003/4/1

WITH SCHEMABINDINGベーステーブルの定義にビューをバインド

ベーステーブルに対し、ビュー定義に影響を与える変更は行えない

WITH CHECK OPTION行がビューに表示されなくなるような変更は実行できない

部門ID 部門名

10 企画部

11 営業部

12 生産部

社員テーブル部門テーブル

部門名 社員名 電話番号

企画部 鈴木 和康 03-0123-〇△×〇

営業部 矢嶋 聡 03-1234-〇☐×△

営業部 荒木 達也 045-456-△×△〇

vw_部門別社員情報

CREATE VIEW vw_部門別社員情報WITH SCHEMABINDING

AS

SELECT 部門名,社員名,電話番号

FROM dbo.部門

JOIN dbo.社員

ON 部門.部門ID

= 社員.部門ID

WHERE 部門.部門ID IN (10,11)

WITH CHECK OPTION

Page 32: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

32 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ビューを使用したデータの変更

元になる複数のテーブルを同時に変更することはできない

以下の列は変更できない

集計関数または計算から得られた列を変更できない

GROUP BY、HAVING、または DISTINCT 句の影響を受ける列を変更できない

Page 33: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

33 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

インデックス付きビュー

インデックス付きビューの利点

ビューを永続化し、パフォーマンスを向上させる

クエリ オプティマイザーがクエリの解決にビューを使用できるようになる

インデックス付きビューの選択シナリオ

パフォーマンス向上がメンテナンスのオーバー ヘッドより重要

基になるテーブルのデータが頻繁に変更されない

クエリで多数のテーブルの結合や集計を実行する

インデックス付きビューの要件ビューに作成する最初のインデックスの種類は一意なクラスター化インデックス

SCHEMABINDING オプションを使用する

スキーマ バインドによって、ベース テーブルのスキーマにビューをバインドする

ビューから他のビューは参照できない

ベース テーブルはビューと同じデータベース内にあり、ビューと同じ所有者にする

ビューが参照するテーブルやユーザー定義関数は、<スキーマ名>.<オブジェクト名>の 2 部構成の形式で参照する

1 部、3 部、または 4 部構成の形式で構成されるオブジェクト名は使用できない

ビューから非決定的関数は参照できない

GROUP BY を記述する場合、ビュー定義に COUNT_BIG(*) を記述する

Page 34: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

34 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q5:インデックス付きビューの定義

問:次の要件を満たす dbo.vwTokyoStudents という名前のビューを定義するProvince が「Tokyo」の生徒のすべての情報を表示する

ビューから Address テーブルにデータを挿入する場合、Province が「Tokyo」以外の生徒の情報は、挿入させないようにする

作成するビューにインデックスを作成できるようにする

次の CREATE VIEW ステートメントを実行する

CREATE VIEW dbo.vwTokyoStudentsWITH SCHEMABINDING AS SELECT *FROM Student sINNER JOIN Address a ON s.AddressID = a.AddressIDINNER JOIN EducationHistory e ON s.StudentID = e.StudentIDWHERE a.Province = 'Tokyo'WITH CHECK OPTION

Page 35: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

35 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q6:インデックス付きビューの定義

問:次のビュー参照のパフォーマンスを向上させるには?

次のステートメントを実行する

CREATE VIEW Sales.vwCustomerSalesAmountWITH SCHEMABINDING AS SELECT

O.CustomerID,C.Name,SUM(O.SalesAmount) AS CustomerTotal,COUNT_BIG(*) AS Count

FROM Sales.Orders AS OINNER JOIN Sales.Customers AS CON O.CustomerID = C.CustomerIDGROUP BY O.CustomerID,C.Name

CREATE UNIQUE CLUSTERED INDEX idx_vwCustomerSalesAmountON Sales.vwCustomerSalesAmount (CustomerID)

Page 36: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

36 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

T-SQL を使用したテーブルの作成と変更

ビューの作成と変更

DML トリガーの作成と変更

Page 37: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

37 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

トリガーとは?

特別な種類のストアド プロシージャ

トリガーとトリガーを引き起こしたステートメントは 1 つのトランザクションに含まれる

DML トリガー

テーブルに作成

INSERT、UPDATE、または DELETE ステートメントによりテーブル変更時にデータベース エンジンにより起動される

2 つの種類

AFTER トリガー

INSERT、UPDATE、または DELETE ステートメントの実行後に起動される

INSTEAD OF トリガー

テーブル、またはビューに作成

INSERT、UPDATE、または DELETE のステートメントの代わりに起動される

DDL トリガー

サーバーに作成

DDL ステートメント実行時に起動される

データベースオブジェクトの変更を監査

Page 38: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

38 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

DMLトリガー定義の基本構文

DML トリガー

FOR と記述した場合、AFTER と同じ

CREATE TRIGGER <スキーマ名>.<トリガー名>

ON {<テーブル名>| <ビュー名>}

{FOR | AFTER | INSTEAD OF}

{[INSERT][,][UPDATE][,][DELETE]}

AS

BEGIN

・・・END

Page 39: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

39 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

DML AFTER トリガーの例

inserted テーブル

挿入されたデータ行を保持

deleted テーブル

削除されたデータ行を保持

例:Products テーブルの RetailPrice 列、または SalesPrice 列の値が変更された場合、PriceUpdateHistory テーブルに変更前の値を記録するトリガー

CREATE TRIGGER dbo.TrgPriceUpdateON Products AFTER UPDATEASIF UPDATE(RetailPrice) OR UPDATE(SalePrice) INSERT INTO dbo.PriceUpdateHistorySELECT ProductID,RetailPrice AS OldRetailPrice,SalePrice AS OldSalePrice,GETDATE() AS UpdatedDateTimeFROM DELETED

Page 40: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

40 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

DML INSTEAD OF トリガー

トリガーを起動するステートメントの動作を置き換える

使用例

1 つ以上の列に対するエラー チェックや値チェックの実行

行の挿入、更新、削除操作に対する追加の処理を実行

UNION ALL や INNER JOIN で結合された複数のベース テーブルを持つビューに対する挿入、更新、削除操作

Page 41: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

41 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

DML INSTEAD OF トリガーの例

次の要件を満たすトリガーを Transactions テーブルに作成する

Transactions テーブルにデータが挿入される場合、Accounts テーブルにAccountNumber が存在する場合のみ データが挿入されるようにする

複数データが挿入される場合でも正しく動作する必要がある

次の CREATE TRIGGER ステートメントを実行する

CREATE TRIGGER TrgValidateAccountNumberON TransactionsINSTEAD OF INSERT ASBEGININSERT INTO TransactionsSELECT TransactionID ,AccountNumber ,Amount ,DateFROM INSERTEDWHERE AccountNumber IN (SELECT AccountNumber FROM Accounts)

END

Page 42: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

42 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q7 ビューへのトリガーの作成

リレーションシップが設定された Employee と Address テーブル

各テーブルの主キー列には、IDENTITY プロパティが設定されている

次の定義文で vwEmployeeInfo という名前のビューを作成した

ビューに対して、INSERT や INSERT ・・・ SELECT ステートメントが実行された場合、Employee と Address テーブルにデータの挿入を可能にするためのトリガーを定義する

CREATE VIEW vwEmployeeInfoAS SELECTe.LastName

,e.FirstName,e.BirthDate,a.AddressID,a.Province,a.City,a.Address1,a.Address2FROM dbo.employee eINNER JOIN dbo.address aON e.AddressID = a.AddressID

CREATE TRIGGER trgVwEmployeeInfoON VwEmployeeInfoINSTEAD OF INSERTASBEGINDECLARE @AddressID intINSERT INTO dbo.Address(Province,City,Address1,Address2)SELECT Province,City,Address1,Address2 FROM INSERTEDSELECT @AddressID = SCOPE_IDENTITY()INSERT INTO dbo.Employee(LastName,FirstName,BirthDate,AddressID)SELECT LastName,FirstName,BirthDate,@AddressID FROM INSERTEDEND

Page 43: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

43 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

コースの概要

第1章 データベース オブジェクトの作成

T-SQL を使用したテーブルの作成と変更

ビューの作成と変更

DML トリガーの作成と変更

第2章 データの取得と変更

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DML ステートメントによるデータの変更

第3章 関数とストアド プロシージャ

関数

ストアド プロシージャ

第4章 クエリのトラブル シューティングと最適化

クエリの最適化

トランザクション管理

エラー処理

Page 44: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

44 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DMLステートメントによるデータの変更

Page 45: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

45 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

SELECT ステートメント

基本構文

テーブルの結合 (ANSI 89)・・・内部結合のみ

テーブルの結合 (ANSI 92)

SELECT <選択リスト> [ INTO <新しいテーブル名>]FROM <スキーマ名>.<テーブル名> [ WHERE <検索条件> ][ ORDER BY <並べ替えで使用する列名> [ ASC | DESC ] ]

SELECT <選択リスト>FROM <スキーマ名>.<テーブル名> , <スキーマ名>.<テーブル名> WHERE <結合条件>

SELECT <選択リスト>FROM <スキーマ名>.<テーブル名> JOIN <スキーマ名>.<テーブル名> ON <結合条件>

Page 46: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

46 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

テーブルの結合

社員と部門テーブルの定義内容

各テーブルに格納されたデータ

Page 47: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

47 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

内部結合

内部結合

結果セット

SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d INNER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID

Page 48: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

48 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

外部結合

左外部結合

結果セット

右外部結合

結果セット

SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d LEFT OUTER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID

SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d RIGHT OUTER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID

Page 49: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

49 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

外部結合

完全外部結合

結果セット

SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d FULL OUTER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID

Page 50: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

50 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

クロス結合

クロス結合

結果セット

SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d CROSS JOIN dbo.Employee e

Page 51: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

51 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q8:テーブルの結合

問:次の要件を満たす SELECT ステートメントを記述する

顧客が購買した日を確認するため、Customers テーブルの Name 列とOrders テーブルの OrderDate 列を表示する

何も購買していない顧客の情報も表示する

次の SELECT ステートメントを実行する

SELECT c.Name

,o.OrderDateFROM Customers AS cLEFT OUTER JOIN Orders AS oON c.CustomerID = o.CustomerID

Page 52: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

52 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

サブ クエリの記述

SELECT、INSERT、UPDATE、および DELETE ステートメントの内部、または別のサブクエリの内部で入れ子になっているクエリ

別のクエリの結果セットに依存するクエリ

式が使えるところであればどこにでも記述できる

SOME、ANY

サブ クエリが返すスカラー値のいずれかの値と比較

比較演算子の条件が一つでも True になる場合、True を返す

条件がすべて False になる場合、False を返す

ALL

サブ クエリが返すスカラー値のすべての値と比較

比較演算子の条件がすべて True になる場合、True を返す

条件が一つでも False になる場合、False を返す

Page 53: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

53 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

SOME、ANY、ALL、IN 演算子

テーブルに格納されているデータ

比較演算子の条件が一つでも True になる場合、True を返す (<> ANY と同等)

比較演算子の条件がすべて True になる場合、True を返す (NOT IN と同等)

--社員の Tanakaが所属していない部署SELECT * FROM dbo.DepartmentWHERE DepartmentID <> SOME(SELECT DepartmentID FROM dbo.EmployeeWHERE EmployeeName = 'Tanaka')

--社員が誰も所属していない部署SELECT * FROM dbo.DepartmentWHERE DepartmentID <> ALL(SELECT DepartmentID FROM dbo.Employee)

Page 54: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

54 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q9: SOME、ANY、ALL、IN 演算子

問:営業担当がいない地域に住む顧客の一覧を表示する

A. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > SOME (SELECT CityID FROM Sales.Salesperson)

B. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ALL (SELECT CityID FROM Sales.Salesperson)

C. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ANY (SELECT CityID FROM Sales.Salesperson)

D. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID NOT IN (SELECT CityID FROM Sales.Salesperson)

A. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > SOME (SELECT CityID FROM Sales.Salesperson)

B. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ALL (SELECT CityID FROM Sales.Salesperson)

C. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ANY (SELECT CityID FROM Sales.Salesperson)

D. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID NOT IN (SELECT CityID FROM Sales.Salesperson)

Page 55: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

55 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

共通テーブル式 (CTE)

ANSI-99 SQL 規格に準拠した一時的な名前付き結果セット

派生テーブルの改良

一度だけ評価されステートメントが完了するまで保持される

複数回の参照、自己参照が可能

WITH 句で開始

名前 AS に続き丸括弧内に表現式

複数の CTE を記述する場合、カンマで区切る

結果セットを返す SELECT ステートメントが続く

WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)

AS

( SELECT

SalesPersonID

, SalesOrderID

, YEAR(OrderDate) AS SalesYear

FROM Sales.SalesOrderHeader

WHERE SalesPersonID IS NOT NULL)

SELECT

SalesPersonID

, COUNT(SalesOrderID) AS TotalSales

, SalesYear

FROM Sales_CTE

GROUP BY SalesYear, SalesPersonID

ORDER BY SalesPersonID, SalesYear

GO

「Sales_CTE」という名前の CTE の定義

CTE のデータを取得する SELECT

CTE を参照する SELECT

WITH <CTE名>AS(<SELECTステートメント>)<DMLステートメント>

Page 56: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

56 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q10:共通テーブル式 (CTE)

問:次の要件を満たす CTE を使用した SELECT ステートメントを記述する

最後に商品を購入してから 2 年間、商品を購入していない顧客名と最新の購入日を表示する

次の SELECT ステートメントを実行する

WITH CTE (CustomerID, MostResentOrderDate) AS (SELECT CustomerID, MAX(OrderDate) AS MostResentOrderDateFROM dbo.OrderSummaryGROUP BY CustomerID)SELECT ci.CustomerName,MostResentOrderDateFROM CTEINNER JOIN dbo.CustomerInfo ci ON CTE.CustomerID = ci.CustomerIDWHERE cte.MostResentOrderDate < DATEADD(YEAR, -2, GETDATE() )

Page 57: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

57 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q11:共通テーブル式 (CTE)

問:次の要件を満たす CTE を使用した DELETE ステートメントを記述する

Products テーブルの Name 列に重複した値がある場合、削除する

UpdatedDate 列の値が古い方を削除する

次の DELETE ステートメントを実行する

WITH CTEDupRecordsAS(SELECT MAX(UpdatedDate) AS UpdatedDate, NameFROM ProductsGROUP BY NameHAVING COUNT(*) > 1)DELETE pFROM Products AS pJOIN CTEDupRecords AS cte ONcte.Name = p.NameAND cte.UpdatedDate > p.UpdatedDate

Page 58: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

58 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DMLステートメントによるデータの変更

Page 59: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

59 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

集計クエリの SELECT ステートメント

基本構文

集計関数

集計クエリの例

SELECT <選択リスト>FROM <スキーマ名>.<テーブル名>[ WHERE <検索条件> ][ GROUP BY <グループ化する列名> ][ HAVING <検索条件> ][ ORDER BY <並べ替えで使用する列名> [ ASC | DESC ] ]

集計関数 説明

AVG 値の平均値

COUNT 値の数

COUNT(*) 行の数

MAX 最大値

MIN 最小値

SUM 値の合計値

SELECT ProductID, SUM (LineTotal) AS TotalSalesAmountFROM Sales.SalesOrderDetailGROUP BY ProductIDORDER BY ProductID

Page 60: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

60 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q12:集計クエリ

問:次の集計クエリを記述しましたが、実行するとエラーになる

この集計クエリを次の要件を満たすようにして完成する

SELECT と FROM 句は上記クエリを利用する

SalesOrderID ごとに降順に並び替えて ProductID ごとに集計する

ProductID は昇順に表示する

SELECT SalesOrderID,ProductID,AVG (OrderQty),SUM (UnitPrice),MAX (UnitPriceDiscount)FROM Sales.SalesOrderDetail

SELECT SalesOrderID,ProductID,AVG (OrderQty),SUM (UnitPrice),MAX (UnitPriceDiscount)FROM Sales.SalesOrderDetailGROUP BY SalesOrderID ,ProductIDORDER BY SalesOrderID DESC ,ProductID ASC

Page 61: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

61 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q13:集計クエリ

問:次の要件を満たす集計クエリを記述する

結果セットには顧客の名前、注文日の順序で表示する

注文日は顧客ごとに最新の日付のみを表示し、列名を「MostResentOrderDate」とする

注文日を降順に並び替えて表示する

ANSI 92 以降の構文に準拠する

次の SELECT ステートメントを実行する

SELECT C.Name

, MAX(O.OrderDate) AS MostRecentOrderDateFROM Customers AS C INNER JOIN Orders AS OON C.CustomerID = O.CustomerIDGROUP BY C.NameORDER BY MostRecentOrderDate DESC

Page 62: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

62 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ROLLUP、CUBE、GROUPING SETS

ROLLUP

単純な GROUP BY 集計行と小計行、および総計行を生成

CUBEROLLUP 集計行とクロス集計行を生成

GROUPING SETS指定したグループの集計のみを生成する

SELECT CustomerID, ProductID, SUM([Total Amount] AS TotalFROM dbo.v_OrderSummaryGROUP BY ROLLUP (CustomerID, ProductID)

SELECT CustomerID, ProductID, SUM([Total Amount] AS TotalFROM dbo.v_OrderSummaryGROUP BY CUBE (CustomerID, ProductID)

SELECT CustomerID, ProductID, SUM([Total Amount] AS TotalFROM dbo.v_OrderSummaryGROUP BY GROUPING SETS ((CustomerID, (ProductID),

(ProductID),())

Page 63: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

63 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

順位付けの対象となる行セットのパーティション分割と並べ替え方法を指定

構文

順位付け関数

順位付け関数 説明

ROW_NUMBER() 順序番号を生成

RANK() 対象行より 1 つ前の行数に 1 を加算した値 (同じ順位の行には同じ順位番号が付けられ、番号が飛ぶ)

DENSE_RANK() 対象行より 1 つ前の行の順位数に 1 を加算した値

NTILE() 対象の結果セットを指定された数で分割

SELECT <選択リスト>,<順位付け関数>RANK() OVER (ODER BY <列名> [ ASC | DESC ] ) AS <別名>FROM <スキーマ名>.<テーブル名>ORDER BY <スキーマ名>. <列名> [ ASC | DESC ]

Page 64: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

64 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

サンプル クエリ

結果セット

順位付け関数

SELECT CustomerID,[Total Amount]

,ROW_NUMBER()OVER(ORDER BY [Total Amount] DESC) AS Order_ROW_NUMBER

,RANK() OVER(ORDER BY [Total Amount] DESC) AS Order_Rank

,DENSE_RANK() OVER(ORDER BY [Total Amount] DESC) AS Order_Dense_Rank

,NTILE(100) OVER(ORDER BY [Total Amount] DESC) AS Ntile_100

FROM dbo.OrderSummary2

ORDER BY [Total Amount] DESC

Page 65: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

65 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q14 順位付け関数

問:次の要件を満たす順位付け関数を使用したクエリを記述する

ProductCatalog テーブルの列を参照し、製品リストを作成する

テーブルに定義された列の順序ですべての列の値を表示し、最後の列に RriceRank という名前の列を追加し、SalesPrice 列の値で行の順位付けをする

SalesPrice の値を降順で表示する

複数の製品で SalesPrice 列の値が同じ場合、同じ順序を付けて番号を飛ばす

次の SELECT ステートメントを実行する

SELECT ProductCatalog.ProductID,ProductCatalog.Name,ProductCatalog.RetailPrice,ProductCatalog.SalesPrice,RANK() OVER (ORDER BY ProductCatalog.SalesPrice DESC) AS PriceRankFROM Sales.ProductCatalogORDER BY ProductCatalog.SalesPrice DESC

Page 66: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

66 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q15 順位付け関数

科目ごとに最高得点の生徒を得点と一緒に表示する

A. SELECT StudentID, Name, RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value

B. SELECT StudentID, Name, DENSE_RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value

C. SELECT StudentID, Name, NTILE(3) OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value

D. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

E. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

F. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

G. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

A. SELECT StudentID, Name, RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value

B. SELECT StudentID, Name, DENSE_RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value

C. SELECT StudentID, Name, NTILE(3) OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value

D. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

E. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

F. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

G. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1

Page 67: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

67 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

LAG 関数と LEAD 関数

LAG 関数

自己結合を使用せずに同じ結果セットの前の行からデータにアクセス

LEAD 関数

自己結合を使用せずに同じ結果セットの後続の行からデータにアクセス

SELECT YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota, LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota

FROM Sales.SalesPersonQuotaHistoryWHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006')

SELECT YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota, LEAD(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota

FROM Sales.SalesPersonQuotaHistoryWHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006')

Page 68: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

68 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

UNION と UNION ALL

UNION 演算子

結果セットを結合する

複数のステートメントの選択リスト内の式 (列名、算術式、集計関数など) の数は、すべて同じにする

重複する行は削除される

重複する行を削除したくない場合、UNION ALL を記述する

SELECT COUNT (*) AS NumberOf Sales

,SUM (SalesAmount) AS TotalSalesAmountFROM DomesticSalesOrdersUNION ALL SELECT COUNT (*) AS NumberOfSales

,SUM (SalesAmount) AS TotalSalesAmountFROM InternationalSalesOrders

Page 69: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

69 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DMLステートメントによるデータの変更

Page 70: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

70 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

XML クエリ

SQL クエリを XML データに変換

FOR XML モード

FOR XML モード XML の構造

RAW 行セットを汎用識別子 <row> を持つ XML に変換属性(既定)、または要素 (ELEMENTS ディレクティブを記述) に展開

AUTO 行セットを XML に変換複数テーブルの親子関係を階層に反映属性(既定)、または要素 (ELEMENTS ディレクティブを記述) に展開

PATH XML 構造の厳密な制御が可能列の別名に XPath 式を記述し要素と属性の展開パターン、および階層構造を制御する(要素 (既定) または属性(AS 句で XPath 式を記述) に展開)

Page 71: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

71 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q16:XML クエリ

適切な FOR XML モードを指定する

SELECT

OrderID

,OrderDate

,SalesAmount

,Name

,City

FROM Orders

INNER JOIN Customers

ON Orders.CustomerID = Customers.CustomerID

WHERE Customers.CustomerID = 1

FOR XML RAW

<row OrderID="1" OrderDate="2013-04-01" SalesAmount="1000.0000" Name="Tanaka" City="Chiba" />

<row OrderID="6" OrderDate="2013-04-02" SalesAmount="280.0000" Name="Tanaka" City="Chiba" />

Page 72: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

72 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q17:XML クエリ

<Orders OrderID="1" OrderDate="2013-04-01" SalesAmount="1000.0000">

<Customers Name="Tanaka" City="Chiba" />

</Orders>

<Orders OrderID="6" OrderDate="2013-04-02" SalesAmount="280.0000">

<Customers Name="Tanaka" City="Chiba" />

</Orders>

SELECT

OrderID

,OrderDate

,SalesAmount

,Name

,City

FROM Orders

INNER JOIN Customers

ON Orders.CustomerID = Customers.CustomerID

WHERE Customers.CustomerID = 1

FOR XML AUTO

適切な FOR XML モードを指定する

Page 73: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

73 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q18:XML クエリ

<Orders><OrderID>1</OrderID><OrderDate>2013-04-01</OrderDate><SalesAmount>1000.0000</SalesAmount><Customers>

<Name>Tanaka</Name><City>Chiba</City>

</Customers></Orders>

SELECT

OrderID

,OrderDate

,SalesAmount

,Name

,City

FROM Orders

INNER JOIN Customers

ON Orders.CustomerID = Customers.CustomerID

WHERE Customers.CustomerID = 1

FOR XML AUTO ,ELEMENTS

適切な FOR XML モードを指定する

Page 74: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

74 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q19:XML クエリ

<Customers Name="Tanaka" City="Chiba"><OrderID>1</OrderID><OrderDate>2013-04-01</OrderDate><SalesAmount>1000.0000</SalesAmount>

</Customers><Customers Name="Tanaka" City="Chiba">

<OrderID>6</OrderID><OrderDate>2013-04-02</OrderDate><SalesAmount>280.0000</SalesAmount>

</Customers>

SELECT

Name AS '@Name'

,City AS '@City'

,OrderID

,OrderDate

,SalesAmount

FROM Orders

INNER JOIN Customers

ON Orders.CustomerID = Customers.CustomerID

WHERE Customers.CustomerID = 1

FOR XML PATH ('Customers')

属性として展開

属性として展開

適切な FOR XML モードを指定する

Page 75: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

75 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DML ステートメントによるデータの変更

Page 76: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

76 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

OUTPUT 句を使用したデータの更新

OUTPUT ・・・ INTO 句

更新されたデータのアーカイブや検証で使用

UPDATE ステートメントで影響を受ける行の情報を INSERTED、およびDELETED テーブルの値として返す

INTO に指定したテーブル、またはテーブル型変数にデータを挿入

価格変更の情報を格納する例

UPDATE Production.ProductSET ListPrice = ListPrice * 1.05OUTPUT INSERTED.ProductID

,DELETED.ListPrice,INSERTED.ListPrice

INTO Production.ProductListPrice_Log (ProductID, OldPrice, NewPrice)GO

Page 77: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

77 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

バイナリ ラージ オブジェクト (BLOB) の更新

BLOB データ型

varchar(max)、 nvarchar(max)、varbinary(max)

8000 バイト以上のデータを格納

varbinary(max) には文書ファイル、画像、動画などを格納できる

Windows API からもアクセスする場合は、FILESTREAM 属性を指定

データの更新方法

UPDATE ステートメントに列に対する WRITE メソッドを記述

WRITE メソッドの構文

サンプル コード

<列名>.WRITE (<新しい値>,@Offset,@Length)

DECLARE @MyTableVar table (SummaryBefore nvarchar(max)

, SummaryAfter nvarchar(max))GOUPDATE Production.DocumentSET DocumentSummary.WRITE (N'features',28,10) OUTPUT DELETED.DocumentSummary

, INSERTED.DocumentSummaryINTO @MyTableVarWHERE Title = N'Front Reflector Bracket Installation'GOSELECT SummaryBefore, SummaryAfter FROM @MyTableVar

Page 78: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

78 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

MERGE ステートメント

ANSI SQL 2006 準拠

データソースを対象のテーブル、またはビューと結合し、その結合結果に基づいて複数の操作を実行

単一ステートメントで INSERT、UPDATE、および DELETE 操作を実行できる

複数の行セット入力に使用

MERGE <対象テーブル> USING <ソース テーブル> ON <結合条件>

WHEN MATCHED

THEN UPDATE SET <対象テーブル>.<列名> = <ソース テーブル>.<列名>

WHEN MATCHED AND <式>

THEN DELETE

WHEN NOT MATCHED BY TARGET

THEN INSERT VALUES(・・・)

Page 79: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

79 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q20:MERGE ステートメント

問:TerritoryInfo テーブルのデータをメンテナンスするストアドプロシージャを完成させる

TerritoryCode が存在する場合は更新する

TerritoryCode が存在しない場合は挿入する

CREATE PROCEDURE dbo.InsertTerritoryInfo@TerritoryCode int,@TerritoryName nvarchar(50),@Country nvarchar(10)ASBEGINSET NOCOUNT ONMERGE dbo.TerritoryInfo AS targetUSING (SELECT @TerritoryCode, @TerritoryName, @Country)AS source (TerritoryCode, TerritoryName, Country)ON (target.TerritoryCode = source.TerritoryCode)

WHEN MATCHED THEN UPDATE SET target.TerritoryName = source.TerritoryName,

target.Country = source.CountryWHEN NOT MATCHED BY TARGET THEN INSERT(TerritoryCode, TerritoryName, Country)VALUES(source.TerritoryCode, source.TerritoryName, source.Country);

END

Page 80: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

80 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

コースの概要

第1章 データベース オブジェクトの作成

T-SQL を使用したテーブルの作成と変更

ビューの作成と変更

DML トリガーの作成と変更

第2章 データの取得と変更

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DML ステートメントによるデータの変更

第3章 関数とストアド プロシージャ

関数

ストアド プロシージャ

第4章 クエリのトラブル シューティングと最適化

クエリの最適化

トランザクション管理

エラー処理

Page 81: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

81 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

関数の使用

関数の作成

ストアド プロシージャの作成と変更

Page 82: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

82 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

CONVERT() 関数

値を指定されたデータ型に変換する

基本構文

使用例

CONVERT ( <データ型> , <値> )

CREATE PROCEDURE usp_GetOrderInfo@Parameter1 varchar(20)ASSELECT Orders.OrderIDFROM OrdersWHERE Orders.OrderDate > CONVERT(datetime,@Parameter1)

SELECT COUNT(*)FROM PurchasesWHERE PurchaseTime >= CONVERT(date, GETDATE())AND PurchaseTime < DATEADD(day, 1, CONVERT(date, GETDATE()))

Page 83: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

83 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

TRY_PARSE() 関数

値を指定されたデータ型に変換する

変換に失敗する場合 NULL を返す

基本構文

使用例

DECLARE @var varchar(MAX) = '1234567.123' SELECT IIF(TRY_PARSE(@var AS decimal(10,3)) IS NULL,

'True', 'False')

AS Result

TRY_PARSE (<値> AS <データ型> )

Page 84: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

84 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

FORMAT() 関数

形式とオプションのカルチャを指定し、書式設定された値を返す

基本構文

使用例

カルチャ情報に基づく各国対応した形式への変換が可能

FORMAT (<値> , <形式> [, <カルチャ>] )

SELECT FORMAT(GETDATE(), 'yyyy-mm-dd', 'ja-JP')

Page 85: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

85 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

EOMONTH 関数

オプションのオフセットを使用し、指定された日付の月の最終日を返す

基本構文

使用例

DECLARE @date DATETIME SET @date = GETDATE() SELECT EOMONTH ( @date ) AS '当月末日' SELECT EOMONTH ( @date, 1 ) AS '来月末日' SELECT EOMONTH ( @date, -1 ) AS '先月末日'

EOMONTH ( <日付> [, <月数>] )

Page 86: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

86 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

関数の使用

関数の作成

ストアド プロシージャの作成と変更

Page 87: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

87 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

関数を使用するシナリオ

SELECT などの Transact-SQL ステートメント内で使用する

関数を呼び出すアプリケーション内で使用する

別のユーザー定義関数の定義内で使用する

ビューをパラメータ化したり、インデックス付きビューの機能を向上させる

テーブルの計算列を定義する

他のテーブルを参照するような場合

列の CHECK 制約を定義する

Page 88: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

88 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

関数の種類

スカラー値関数

単一値を返す

式を記述できる箇所で使用

テーブル値関数

結果セットを返す

FROM 句に使用

パラメータを持つビューに似ている

Page 89: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

89 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

関数定義の基本構文

インライン関数単一の SELECT ステートメントの結果を返す

複数ステートメント関数BEGIN ~ END ブロック構造

CREATE FUNCTION スキーマ名.関数名(@パラメータ名1 データ型, @パラメータ名2 データ型, ・・・) RETURNS データ型[WITH オプション]AS RETURN(

SELECT 列名1,列名2,・・FROM スキーマ名.テーブル名WHERE 行の検索条件)

CREATE FUNCTION スキーマ名.関数名(@パラメータ名1 データ型, @パラメータ名2 データ型, ・・・) RETURNS データ型[WITH オプション]AS

BEGIN

・・・RETURN

END

Page 90: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

90 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

スカラー値関数の例

RETURNS 句で戻り値のデータ型を指定

同じデータ型のスカラー式が許容される任意の場所で呼び出せる

CREATE FUNCTION dbo.LeapYearCheck (@Date datetime)

RETURNS int

AS

BEGIN

DECLARE @Year int

DECLARE @LeapYear bit

SET @Year = YEAR(@Date)

IF((@Year % 4 = 0 AND @Year % 100 != 0) OR @Year % 400 = 0)

SET @LeapYear = 1

ELSE

SET @LeapYear = 0

RETURN (@LeapYear)

END

SELECT

FirstName

,LastName

,year(BirthDate) AS BirthYear

,dbo.LeapYearCheck(BirthDate) AS LeapYear

FROM HumanResources.Employee

Page 91: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

91 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

テーブル値関数の例

RETURNS に table データ型を指定

関数の内容は 単一の SELECT ステートメント

返されるデータ構造はクエリ定義によって決まる

依存するテーブルの構造を変更させたくない場合 WITH 句に SHEMABINDING を記述

FROM 句に記述して呼び出す

CREATE FUNCTION dbo.GetStockQty

(@ProductID int)

RETURNS table

WITH SCHEMABINDING

AS

RETURN(

SELECT

l.Name

,pi.Bin

,pi.Shelf

,pi.Quantity

FROM Production.ProductInventory pi

INNER JOIN Production.Location l

ON pi.LocationID = l.LocationID

WHERE ProductID = @ProductID

)

SELECT *

FROM dbo.GetStockQty(2)

Page 92: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

92 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

テーブル値関数の結合

CROSS APPLY を使用したテーブル値関数の結果との結合

外部テーブルを左入力、テーブル値関数は右入力とする

外部結合の場合は OUTER APPLY を記述

SELECTcp.plan_handle

,OBJECT_NAME(qp.objectid) AS 'object_name',qp.query_plan,cp.objtypeFROM sys.dm_exec_cached_plans cpCROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qpWHERE cp.objtype ='Proc'

Page 93: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

93 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

関数の使用

関数の作成

ストアド プロシージャの作成と変更

Page 94: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

94 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ストアド プロシージャとは?

Transact-SQL ステートメント、または Microsoft .NET Framework コードのコレクションに名前を付けたもの

EXECUTE ステートメントで実行

入力パラメータを受け入れ、出力パラメータ値を返す

成功または失敗を示すステータス値を返す

ストアド プロシージャの種類

システム ストアド プロシージャ

拡張システム ストアド プロシージャ

ユーザー定義の Transact-SQL ストアド プロシージャ

ユーザー定義の SQLCLR ストアド プロシージャ

関数との違い

エラー ハンドリングが可能

DDL ステートメントが記述できる

EXECUTE で呼び出すため、クエリやビューの中には記述できない

Page 95: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

95 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ストアド プロシージャの定義

ストアド プロシージャの構文

主要なオプション

ENCRYPTION

CREATE PROCEDURE ステートメントの元のテキストを、暗号化した形式に変換することを

EXECUTE AS

プロシージャを実行するコンテキストの指定

RECOMPILE

プロシージャのプランをキャッシュしない

CREATE PROCEDURE <プロシージャ名>[@<入力パラメーター1> <データ型>[= <既定値>]]

,[@<入力パラメーター2> <データ型>[= <既定値>]], …,[@<出力パラメーター1> <データ型> OUTPUT],[@<出力パラメーター2> <データ型> OUTPUT], …WITH <オプション>AS <SQLステートメント>

Page 96: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

96 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

EXECUTE AS による実行コンテキスト制御

所有者が異なるオブジェクトの場合

EXECUTE AS で所有者に偽装できる

EXECUTE AS に設定できる引数

山本さん

佐藤さんが所有する

テーブル

鈴木さんが所有する

ストアドプロシージャ

(EXECUTE AS ‘佐藤’)

山本さんのEXECUTE 権限がチェックされる

佐藤さんのSELECT 権限が

チェックされる!

引数 説明

CALLER モジュール内のステートメントは、モジュールを実行しているユーザー本人のコンテキストで動作するため、モジュールを実行したユーザーは、そのモジュールが参照するすべてのデータベース オブジェクトに対して適切な権限が付与されている必要がある

OWNER モジュール内のステートメントを、モジュールの所有者のコンテキストで実行する。所有者が指定されていないモジュールについては、そのモジュールのスキーマの所有者のコンテキストが使用される。この引数は、DDLトリガーまたはログオントリガでは指定できない

データベースユーザー名 指定したデータベースユーザーのコンテキストで実行する。サーバースコープの DDL トリガー、またはログオントリガーには指定できない

ログイン名 指定したログインのコンテキストで実行する。サーバースコープの DDL トリガーまたはログオン トリガーにのみ指定できる

Page 97: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

97 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ストアド プロシージャ定義と実行

プロシージャの定義出力パラメーターの指定

OUTPUT 句を指定すると呼び出し元に値が返る戻り値の指定

RETURN 句を指定すると呼び出し元に int 型の値が返る

プロシージャの実行出力パラメーターの指定

OUTPUT 句を指定した変数に値が渡る

CREATE PROCEDURE dbo.usp_GetProductInfo@ID int

,@Price money OUTPUTAS SET NOCOUNT ONSELECT @Price = SalesPriceFROM dbo.ProductsWHERE ProductID = @IDRETURN

DECLARE @Price moneyDECLARE @RC intEXECUTE @RC = dbo.usp_GetProductInfo 771 ,@Price OUTPUTPRINT N'Return Code = ' + CAST(@RC AS nvarchar(8)) +

N' Price = ' + CAST(@Price AS nvarchar(8))

Page 98: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

98 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ストアド プロシージャ実行時の情報取得

@@ERROR

直前に実行したステートメントの整数値のエラー番号を返す

次のステートメントの実行前に変数に退避しないと上書きされる

@@ROWCOUNT

直前に実行したステートメントに影響を受けた行数を返す

次のステートメントの実行前に変数に退避しないと上書きされる

DECLARE @Error intDECLARE @RowCount int

EXECUTE usp_DeleteProductsSELECT @Error = @@ERROR, @RowCount = @@RowCountIF (@Error <> 0)PRINT N'ERROR = ' + CAST(@Error AS nvarchar(8))

+ CAST(@Rowcount AS nvarchar(8)) + N' Rows Deleted!'

Page 99: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

99 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

カーソルを使用した呼び出しの例

結果セットの値によりプロシージャを実行したい場合などに使用する

DECLARE @EmpID intDECLARE contact_cursor CURSOR FORSELECT EmployeeID FROM dbo.Employee

OPEN contact_cursorFETCH NEXT FROM contact_cursorINTO @EmpID

WHILE @@FETCH_STATUS = 0BEGIN

EXECUTE usp_EmpReport @EmpIDFETCH NEXT FROM contact_cursorINTO @EmpID

ENDCLOSE contact_cursorDEALLOCATE contact_cursorGO

Page 100: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

100 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q21:ストアド プロシージャの作成

問:次の要件を満たすストアド プロシージャを記述する

@Count という名前のひとつの int 型のパラメーターを使用する usp_GetProductInfoという名前のストアド プロシージャを作成する

製品名と販売価格のみを返す

@Count パラメーターで指定された値の行数のみを返す

SalesPrice の値を降順で表示する

定義内容を暗号化する

次の CREATE PROCEDURE ステートメントを実行する

CREATE PROCEDURE usp_GetProductInfo@Count intWITH ENCRYPTIONASSELECT TOP(@Count) Products.Name,Products.SalesPriceFROM dbo.ProductsORDER BY Products.SalesPrice DESC

Page 101: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

101 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

コースの概要

第1章 データベース オブジェクトの作成

T-SQL を使用したテーブルの作成と変更

ビューの作成と変更

DML トリガーの作成と変更

第2章 データの取得と変更

SELECT ステートメントによる基本的なクエリ

集計クエリと順位付け

XML データへのクエリ

DML ステートメントによるデータの変更

第3章 関数とストアド プロシージャ

関数

ストアド プロシージャ

第4章 クエリのトラブル シューティングと最適化

クエリの最適化

トランザクション管理

エラー処理

Page 102: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

102 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

クエリの最適化

トランザクション管理

エラー処理

Page 103: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

103 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

実行プラン

クエリ エンジンが生成するクエリ プランとユーザー コンテキスト

クエリ プラン

ユーザー コンテキストを含まない再入可能な読み取り専用のデータ構造体

実行コンテキスト

検索条件の値やパラメータ値など実行に固有のデータ

Page 104: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

104 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

実行プランを発見 コンパイル済みプランを発見

クエリ プラン生成のフロー

実行プランを生成

メモリ割当ての許可 と並列プラン化

実行

プランが発見できない

自動パラメータ化

ビルド、ビューの展開

解析

クエリの最適化

プランをキャッシュに格納

新しいステートメント

プロシージャキャッシュ

の検索

インデックスと統計情報を参照

インデックス 統計情報

クエリ オプティマイザ クエリ実行

言語処理

クエリ エンジン

Page 105: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

105 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

実行プランの表示と制御

ステートメント解析時に推定のグラフィカル プランを表示

ステートメント解析時に推定のテキスト プランを表示

ステートメント実行時に実際に使用したグラフィカル プランを表示

ステートメント実行時に実際に使用したテキスト プランを表示

グラフィカル プランは、クエリ実行に不足するインデックスが見つかると推奨されるインデックスを提案する機能も含む

SET SHOWPLAN_XML ON

GO

SET SHOWPLAN_ALL ON

GO

SET STATISTICS XML ON

GO

SET STATISTICS PROFILE ON

GO

Page 106: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

106 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

クエリの最適化

アドホック クエリの最適化

optimize for ad hoc workloads サーバー構成オプション

毎回、動的に作成される再利用性が低いアドホック クエリのプランでプロシージャ キャッシュがいっぱいにならないように指定できる

EXECUTE sys.sp_configure N'optimize for ad hoc workloads', N'1'GORECONFIGURE WITH OVERRIDEGO

Page 107: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

107 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

統計情報の表示

統計のプロパティ

Page 108: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

108 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

手動による統計情報の作成と更新

統計情報の作成

CREATE STATISTICS

テーブル サイズが大きい場合、サンプリングにより統計情報を生成できる

統計情報の手動更新

統計情報の行数見積もりと実際の行数が異なるような場合、実行する

更新のためのステートメント

UPDATE STATISTICS

sp_updatestats

CREATE STATISTICS <統計情報名>

ON { <テーブル名> | <ビュー名> } ( <列名> [ ,...n ] )

[ WHERE <フィルター述部> ]

[ WITH

[ [ FULLSCAN

| SAMPLE <数値> { PERCENT | ROWS }[ , ] ]

[ NORECOMPUTE ]

]

Page 109: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

109 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

クエリの最適化

トランザクション管理

エラー処理

Page 110: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

110 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

トランザクションとは?

論理的な 1 つの作業単位として実行される一連の操作

トランザクション処理に要求される ACID プロパティ

ACID プロパティ 説明

原子性 (Atomicity) トランザクションは分離できない 1 つの作業単位トランザクション内のデータ変更は、すべて実行されるか、まったく実行されないかのどちらかでなければならない

一貫性 (Consistency) トランザクション完了時、すべてのデータが一貫した状態になければならない

分離性 (Isolation ) 同時実行トランザクションからの変更は、他のトランザクションによって行われる変更から独立している

持続性 (Durability ) トランザクション中にインスタンス停止が発生しても完了したトランザクションによる変更結果は持続されなければならない

Page 111: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

111 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

トランザクションの記述

暗黙的なトランザクション

SET IMPLICIT_TRANSACTIONS ON で開始

トランザクションは自動的に開始され終了または取り消しを記述

ANSI-92 標準、Oracle の既定モード

処理1

処理2

処理3

SET IMPLICIT_TRANSACTIONS ON

COMMIT

ROLLBACK

明示的なトランザクション明示的にトランザクションの開始、終了、取り消しを記述

明示的に開始しない場合ステートメント実行時に一文ずつ確定する(自動コミットモード)

SQL Server の既定モード

トランザクション

トランザクション

処理1

処理2

処理3

BEGIN TRAN TRN1

COMMIT TRAN TR1

ROLLBACK TRAN TR2

BEGIN TRAN TRN2

トランザクション

トランザクション

Page 112: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

112 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

XACT_ABORT

ステートメント実行時にエラーが発生した場合、トランザクション全体を確実にロールバックさせる場合、XACT_ABORT を ON に設定する

例文

XACT_ABORT が OFF の場合、エラーの重大度レベルにより、エラーが発生したステートメントのみが、ロールバックされ、トランザクション処理は継続される場合がある

SET XACT_ABORT ON

GO

Page 113: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

113 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

既定のトランザクション分離レベルでのロック動作

基本的なロック モード

基本的なロックの互換性

トランザクション分離レベルで制御可能

ロックモードの種類 説明

共有 (Shared:S) SELECT ステートメントなどデータ変更を伴わない読み取り操作で使用

更新 (Update:U) INSERT、UPDATE、DELETE ステートメントによるデータ変更を前提とした読み取り操作で使用

排他 (eXclusive:X) INSERT、UPDATE、DELETE ステートメントによるデータ変更で使用

要求されたモード 既に許可されているモード

IS S U IX X

インテント共有 (IS) ○ ○ ○ ○ ×

共有 (S) ○ ○ ○ × ×

更新 (U) ○ ○ × × ×

インテント排他 (IX) ○ × × ○ ×

排他 (X) × × × × ×

Page 114: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

114 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ロック ヒント オプション

DML 文で指定

既定は行ロック

INSERT ステートメントを テーブル ロックを使用して実行する例

INSERT INTO dbo.OrderHistorical WITH (TABLOCK)SELECT * FROM dbo.OrderSummary

ロック ヒントの種類 ロック ヒント

トランザクション分離レベルの指定

SERIALIZABLEREPEATABLEREADREADCOMMITTEDREADCOMMITTEDLOCKREADUNCOMMITTEDNOLOCK

ロック粒度の指定 ROWLOCKPAGLOCKTABLOCKTABLOCKX

ロック期間の指定 HOLDLOCK

ロック モードの指定 UPDLOCKXLOCK

•データベース (S)

•テーブル (IX)

•ページ (IX)

•行 (X)

Page 115: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

115 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

トランザクションの同時実行時の問題

複数のユーザーにより開始されるトランザクション間の相互関係

同時に処理しても良いか?

もしくは完全な分離が必要か?

トランザクション実行時の同時実行時の問題

発生する問題 説明

更新データの損失 更新されたデータが上書きされる

ダーティ リード 未コミットデータが読み込まれる

反復不可能読み取り 参照の都度、変化するデータ

ファントム 現れたり消えたりするレコード

Page 116: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

116 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

トランザクション分離レベルの種類

ロック方式 (ANSI/ISO 標準)

READ UNCOMMITED (未コミット読み取り)

READ COMMITTED (コミット済み読み取り)データベース エンジンの既定の分離レベル

REPEATABLE READ (再読み込み可能読み取り)

SERIALIZABLE (直列化)

SET ステートメントによりセッション レベルで制御可能

マルチ バージョニング方式 (SQL Server 2005 よりサポート)

READ COMMITTED SNAPSHOT

SNAPSHOT (スナップショット分離)

バージョン管理

更新時間と SELECT ステートメント開始時のトランザクション シーケンス番号(XSN)を使用して、tempdb 上に確実に更新前イメージが残るように管理される

tempdb 上のデータは 1 分ごとにチェックされ、参照される可能性がなくなった時点でガベージ コレクションによって自動的に削除される参考 - http://technet.microsoft.com/ja-jp/library/ms175492.aspx

参考 - http://technet.microsoft.com/ja-jp/library/ms186327.aspx

SET TRANSACTION ISOLATION LEVEL <トランザクション分離レベル名>

Page 117: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

117 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

トランザクション分離レベルと同時実行制御

問題点

分離レベル

ダーティリード

反復不可能読み取り

ファントム 同時実行制御

READ UNCOMMITTED 可 可 可 物理排他

(悲観的ロック)

READ COMMITTED 不可 可 可 物理排他

(悲観的ロック)

REPEATABLE READ 不可 不可 可 物理排他

(悲観的ロック)

SERIALIZABLE 不可 不可 不可 物理排他

(悲観的ロック)

READ COMMITTED

SNAPSHOT

不可 可 可 論理排他(楽観的ロック)

SNAPSHOT 不可 不可 不可 論理排他(楽観的ロック)

Page 118: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

118 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ロック方式

ID Price

1001 263

BEGIN TRANSACTION

UPDATE ProductsSET Price = 263WHERE ID = 1001

COMMIT TRANSACTION

TX1

更新後データ(未確定)

更新後データ(確定済み)

BEGIN TRANSACTION

SELECT ID,PriceFROM ProductsWHERE ID = 1001

SELECT ID,PriceFROM ProductsWHERE ID = 1001

COMMIT TRANSACTION

TX2

更新後データを取得

ID Price

1001 263

ID Price

1001 263

READ COMMITTED (既定)

T2

T4

T6

T7

T1

T3

T5

ブロックされる

Page 119: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

119 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

ロック方式

ID Price

1001 263

BEGIN TRANSACTION

UPDATE ProductsSET Price = 263WHERE ID = 1001

COMMIT TRANSACTION

TX1

更新後データ(未確定)

更新後データ(確定済み)

BEGIN TRANSACTION

SELECT ID,PriceFROM ProductsWHERE ID = 1001

SELECT ID,PriceFROM ProductsWHERE ID = 1001

COMMIT TRANSACTION

TX2

ID Price

1001 263

REPEATABLE READ、SERIALIZABLE

T2

T4

T6

T7

T1

T3

T5

ブロックされる

ブロックされる

Page 120: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

120 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

マルチ バージョニング方式

ID Price

1001 263

ID Price

1001 210

tempdb

BEGIN TRANSACTION

UPDATE ProductsSET Price = 263WHERE ID = 1001

COMMIT TRANSACTION

TX1

更新前データ

更新後データ(未確定)

更新後データ(確定済み)

BEGIN TRANSACTION

SELECT ID,PriceFROM ProductsWHERE ID = 1001

SELECT ID,PriceFROM ProductsWHERE ID = 1001

COMMIT TRANSACTION

TX2

更新前データを取得

更新後データを取得

ID Price

1001 210

ID Price

1001 263

ID Price

1001 263

READ COMMITTED SNAPSHOT

T2

T4

T6

T7

T1

T3

T5

ステートメント実行時点の確定済みデータを返す

Page 121: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

121 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

マルチ バージョニング方式

ID Price

1001 263

ID Price

1001 210

tempdb

BEGIN TRANSACTION

UPDATE ProductsSET Price = 263WHERE ID = 1001

COMMIT TRANSACTION

TX1

更新前データ

更新後データ(未確定)

更新後データ(確定済み)

BEGIN TRANSACTION

SELECT ID,PriceFROM ProductsWHERE ID = 1001

SELECT ID,PriceFROM ProductsWHERE ID = 1001

COMMIT TRANSACTION

TX2

更新前データを取得

ID Price

1001 210

ID Price

1001 263

SNAPSHOT

T2

ID Price

1001 210

更新前データを取得

T4

T6

T7

T1

T3

T5

トランザクション開始時点の確定済みデータを返す

Page 122: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

122 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

READ_COMMITTED_SNAPSHOT の設定

ステートメント レベルの読み取り一貫性

SELECT を発行した時点でのデータを読み取ることを保証

更新前データは tempdb に格納

データベースに対して有効化する (既定は無効)

ALTER DATABASEデータベース名SET READ_COMMITTED_SNAPSHOT ON

Page 123: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

123 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

SNAPSHOT の設定

トランザクション レベルの読み取り一貫性

トランザクション発行時点でのデータ保証

更新前データは tempdb に格納

排他ロックを無視して旧バージョンの読み取りが可能

データベースに対して有効化(既定は無効)

SNAPSHOT 分離レベルを使用するセッションで分離レベルを変更

ALTER DATABASEデータベース名SET ALLOW_SNAPSHOT_ISOLATION ON

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Page 124: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

124 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

マルチ バージョニング方式の選択肢

読み取りと書き込みの競合を回避

READ COMMITTED SNAPSHOT

ステートメント レベルの読み取り一貫性

ステートメント実行時点の確定済みデータを返す

SNAPSHOT

トランザクション レベルの読み取り一貫性

トランザクション開始時点の確定済みデータを返す

READ_COMMITED_SNAPSHOT に比べるとtempdb への負荷が高い

Page 125: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

125 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

章の構成

クエリの最適化

トランザクション管理

エラー処理

Page 126: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

126 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

例外処理の実装

実行コードの記述

BEGIN TRY ~ END TRY ブロック

エラー処理の記述

BEGIN CATCH ~ END

BEGIN TRANSACTIONBEGIN TRY

EXEC dbo.usp_UpdateDataCOMMIT TRANSACTION

END TRYBEGIN CATCH

IF @@ERROR != 0ROLLBACK TRANSACTION

END CATCH

Page 127: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

127 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

エラー情報の取得

ERROR_ 関数

TRY ブロックで発生した例外のエラー情報を返す

CATCH ブロック内で値が不変

エラー関数の種類 返される情報 型

ERROR_NUMBER() エラー番号 int

ERROR_SEVERITY() 重大度 int

ERROR_STATE() エラー状態番号 int

ERROR_PROCEDURE() エラーが発生したストアド プロシージャ、トリガの名前 nvarchar(126)

ERROR_LINE() エラーを発生させたルーチン内の行番号 Int

ERROR_MESSAGE() エラーの完全なテキスト メッセージ nvarchar(2048)

Page 128: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

128 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

トランザクションの検査

@@TRANCOUNT

実行中のトランザクションの数

XACT_STATE() 関数

アクティブなトランザクションの有無

戻り値 説明

1 アクティブなユーザー トランザクションが存在してトランザクションのコミットなど、任意の操作を実行できる

0 アクティブなユーザー トランザクションが存在しない

-1 アクティブなユーザー トランザクションが存在するが、コミットできないトランザクションとして分類されるエラーが発生した

Page 129: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

129 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

Q22:トランザクションの検査

次の要件を満たすように顧客データを削除するストアドプロシージャを完成する

このストアドプロシージャは、他のトランザクションから呼び出される

顧客データの削除に成功した場合、監査ログの記録に失敗してもトランザクションをコミットしたい

この要件を見た右ために 14 行目に入力するべきコードは?

1: CREATE PROC DeleteCustomer @CustomerID int2: AS3: BEGIN4: DECLARE @ERROR int5: BEGIN TRANSACTION6: BEGIN TRY7: DELETE dbo.Customers WHERE Customers.CustomerID = @CustomerID8: SELECT @ERROR = @@ERROR9: INSERT INTO Audit.Log(Operation,ErrorCode,OperationDate)10: VALUES ('DELETE ' + CONVERT(varchar(10),@CustomerID),@ERROR,SYSDATETIME())11: COMMIT TRANSACTION12: END TRY13: BEGIN CATCH14: IF (XACT_STATE()) = 115: COMMIT TRANSACTION16: ELSE17: ROLLBACK TRANSACTION18: END CATCH19: END

Page 130: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

130 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.

解答集

# Answers # Answers

Q1 (SourceID, CustID) Q12 SalesOrderID ,ProductIDSalesOrderID DESC ,ProductID ASC

Q2 FOREIGN KEY (CusomerID)、REFERENCES Cusomers (CusomerID)

Q13 MostRecentOrderDate DESC

Q3 DEFAULT NEWID() WITH VALUES Q14 RANK() OVER (ORDER BY ProductCatalog.SalesPrice DESC)

Q4 1、1、1、10、NEXT VALUE FOR CLASS_Sequence Q15 E

Q5 WITH SCHEMABINDING AS 、WITH CHECK OPTION

Q16 RAW

Q6 UNIQUE CLUSTERED INDEX Q17 AUTO

Q7 ON VwEmployeeInfo INSTEAD OF INSERT Q18 AUTO ,ELEMENTS

Q8 LEFT OUTER JOIN Q19 PATH ('Customers')

Q9 B、D Q20 UPDATE SET target.TerritoryName = source.TerritoryName,target.Country = source.Country、INSERT(TerritoryCode, TerritoryName, Country)VALUES(source.TerritoryCode, source.TerritoryName,

source.Country);

Q10 cte.MostResentOrderDate < DATEADD(YEAR, -2, GETDATE()

Q21 WITH ENCRYPTION、TOP、Products.SalesPrice DESC

Q11 MAX、cte.UpdatedDate > p.UpdatedDate Q22 IF (XACT_STATE()) = 1

Page 131: MCP 70-461 Microsoft SQL Server 2012 へのクエリ 試験対策 ...tricra.blog.jp/70-461/SQL_Server_2012_023.pdf「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格

131

© 2013 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.