SQL Server 2012 におけるデータベース エンジン機能の動作の変更

このトピックでは、データベース エンジンの動作変更について説明します。 動作変更によって、SQL Server 2012 の機能や操作方法が SQL Server の以前のバージョンと異なっています。

メタデータの検出

SQL Server 2012 以降のデータベース エンジンの機能強化により、SQLDescribeCol では、SQL Server の以前のバージョンで SQLDescribeCol によって返されていた結果の記述よりも、期待される結果についてさらに正確な記述を取得できるようになりました。 詳細については、「メタデータの検出」を参照してください。

実際にクエリを実行せずに応答の形式を決定するための SET FMTONLY オプションは、sp_describe_first_result_set (Transact-SQL)sp_describe_undeclared_parameters (Transact-SQL)sys.dm_exec_describe_first_result_set (Transact-SQL)、および sys.dm_exec_describe_first_result_set_for_object (Transact-SQL) で置き換えられます。

SQL Server エージェント タスクのスクリプト作成における動作の変更

SQL Server 2012 では、既存のジョブからスクリプトをコピーして新しいジョブを作成した場合、新しいジョブが既存のジョブに悪影響を与える可能性があります。 既存のジョブのスクリプトを使用して新しいジョブを作成するには、@schedule_uid パラメーターを手動で削除します。これは、通常、既存のジョブでジョブ スケジュールを作成するセクションの最後のパラメーターです。 これにより、既存のジョブに影響することなく、新しいジョブ用に別に新しいスケジュールが作成されます。

CLR ユーザー定義関数およびメソッドの定数たたみ込み

SQL Server 2012 では、次のユーザー定義 CLR オブジェクトがたたみ込み可能になりました。

  • 決定的スカラー値 CLR ユーザー定義関数

  • CLR ユーザー定義型の決定的メソッド

この機能強化は、これらの関数またはメソッドが同じ引数で複数回呼び出されたときのパフォーマンスの向上を目的としています。 ただし、この変更により、非決定的関数またはメソッドが誤って決定的とマークされている場合に予期しない結果が生じる可能性があります。 CLR 関数またはメソッドが決定的であるかどうかは、SqlFunctionAttribute または SqlMethodAttribute の IsDeterministic プロパティの値によって示されます。

空の空間型を指定された STEnvelope() メソッドの動作の変更

空のオブジェクトを指定された STEnvelope メソッドの動作が、他の SQL Server 空間メソッドの動作と一致するようになりました。

SQL Server 2008 では、空のオブジェクトを指定して STEnvelope メソッドを呼び出すと次の結果が返されました。

select geometry::Parse('POINT EMPTY').STEnvelope().ToString()
-- returns POINT EMPTY
select geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()
-- returns LINESTRING EMPTY
select geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()
-- returns POLYGON EMPTY

SQL Server 2012 では、空のオブジェクトを指定して STEnvelope メソッドを呼び出すと次の結果が返されます。

select geometry::Parse('POINT EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY
select geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY
select geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()
-- returns GEOMETRYCOLLECTION EMPTY

空間オブジェクトが空であるかどうかを確認するには、STIsEmpty (geometry データ型) メソッドを呼び出します。

LOG 関数の省略可能なパラメーターの追加

LOG 関数に、省略可能な base パラメーターが追加されました。 詳細については、「LOG (Transact-SQL)」を参照してください。

パーティション インデックス操作中の統計計算の変更

SQL Server 2012 では、パーティション インデックスが作成または再構築された場合、テーブル内のすべての行をスキャンして統計を作成することはできません。 代わりに、クエリ オプティマイザーが既定のサンプリング アルゴリズムを使用して統計を生成します。 パーティション インデックスでデータベースをアップグレードした後で、これらのインデックスのヒストグラム データに違いが見つかる場合があります。 この動作の変更はクエリ パフォーマンスに影響しない可能性があります。 テーブル内のすべての行をスキャンしてパーティション インデックスの統計を作成するには、FULLSCAN 句で CREATE STATISTICS または UPDATE STATISTICS を使用します。

XML value メソッドによるデータ型変換の変更

xml データ型の value メソッドの内部動作が変更になりました。 このメソッドは、XML に対して XQuery を実行し、指定された SQL Server データ型のスカラー値を返します。 xs 型は SQL Server データ型に変換する必要があります。 以前は、value メソッドが元の値を内部で xs:string に変換した後、その xs:string を SQL Server データ型に変換していました。 SQL Server 2012 では、次の場合に xs:string への変換がスキップされます。

元の XS データ型

変換後の SQL Server データ型

byte

short

int

integer

long

unsignedByte

unsignedShort

unsignedInt

unsignedLong

positiveInteger

nonPositiveInteger

negativeInteger

nonNegativeInteger

tinyint

smallint

int

bigint

decimal

numeric

decimal

decimal

numeric

float

real

double

float

この新しい動作により、中間の変換をスキップできるときのパフォーマンスが向上します。 ただし、データ型変換が失敗した場合は、中間の xs:string 値からの変換で発生していたエラー メッセージとは異なるエラー メッセージが表示されます。 たとえば、value メソッドが int 値 100000 から smallint への変換に失敗した場合、以前は次のようなエラー メッセージが表示されました。

The conversion of the nvarchar value '100000' overflowed an INT2 column. Use a larger integer column.

SQL Server 2012 では、xs:string への中間の変換が行われず、次のようなエラー メッセージが表示されます。

Arithmetic overflow error converting expression to data type smallint.

XML モードでの sqlcmd.exe の動作変更

SELECT * from T FOR XML … の実行時に XML モード (:XML ON コマンド) で sqlcmd.exe を使用する場合の動作が変更されています。 詳細については、「管理に関する機能強化 (データベース エンジン)」を参照してください。

DBCC CHECKIDENT のメッセージの変更

SQL Server 2012 では、DBCC CHECKIDENT コマンドで RESEED new_reseed_value を使用して現在の ID 値を変更する場合に関してのみ、DBCC CHECKIDENT コマンドから返されるメッセージが変更されています。 新しいメッセージは次のとおりです。"ID 情報を調べています。現在の ID 値 '<current identity value>'。 DBCC の実行が完了しました。 DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。"

以前のバージョンでのメッセージは次のとおりです。"ID 情報を調べています。現在の ID 値 '<現在の ID 値>'、現在の列値 '<現在の列値>'。 DBCC の実行が完了しました。 DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。"このメッセージは、DBCC CHECKIDENT で NORESEED が指定されている場合、2 番目のパラメーターが指定されていない場合、または reseed 値が指定されていない場合に関しては変更されていません。 詳細については、「DBCC CHECKIDENT (Transact-SQL)」を参照してください。

XML データ型に対する exist() 関数の動作の変更

NULL 値である XML データ型を 0 (ゼロ) と比較するときの exist() 関数の動作が変更されています。 次の例を参照してください。

DECLARE @test XML;
SET @test = null;
SELECT COUNT(1) WHERE @test.exist('/dogs') = 0;

以前のバージョンでは、この比較で 1 (true) が返されましたが、0 (ゼロ、false) が返されるようになりました。

以下の比較では変更されていません。

DECLARE @test XML;
SET @test = null;
SELECT COUNT(1) WHERE @test.exist('/dogs') = 1; -- 0 expected, 0 returned
SELECT COUNT(1) WHERE @test.exist('/dogs') IS NULL; -- 1 expected, 1 returned

関連項目

参照

SQL Server 2012 におけるデータベース エンジン機能の重大な変更

SQL Server 2012 データベース エンジンの非推奨機能

SQL Server 2012 で廃止されたデータベース エンジンの機能

ALTER DATABASE 互換性レベル (Transact-SQL)