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

このトピックでは、データベース エンジンの動作の変更について説明します。 動作の変更は、以前のバージョンのSQL Serverと比較して、SQL Server 2014 での機能の動作または対話方法に影響します。

SQL Server 2014 の動作の変更

以前のバージョンのSQL Serverでは、特定の長さ (4020 文字を超える) の文字列を含む XML ドキュメントに対してクエリを実行すると、正しくない結果が返される可能性があります。 SQL Server 2014 では、このようなクエリは正しい結果を返します。

SQL Server 2012 での動作の変更

メタデータの検出

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 関数またはメソッドが決定的であるかどうかは、IsDeterministic または SqlFunctionAttributeSqlMethodAttribute プロパティの値によって示されます。

空の空間型を指定された 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 Data Type) メソッドを呼び出します。

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

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

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

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

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

value データ型の xml メソッドの内部動作が変更になりました。 このメソッドは、XML に対して XQuery を実行し、指定したSQL Serverデータ型のスカラー値を返します。 xs 型は、SQL Serverデータ型に変換する必要があります。 以前は、 メソッドはvalueソース値を xs:string に内部的に変換した後、xs:string をSQL Serverデータ型に変換しました。 SQL Server 2014 では、次の場合、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 2014 では、xs:string への中間変換がない場合、エラー メッセージは次のようになります。

Arithmetic overflow error converting expression to data type smallint.

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

T FOR XML ...から SELECT * を実行するときに、XML モード (:XML ON コマンド) でsqlcmd.exeを使用すると、動作が変更されます。

DBCC CHECKIDENT のメッセージの変更

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

以前のバージョンでは、メッセージは "確認 ID 情報: 現在の ID 値 '<現在の ID 値>' 、現在の列値 '現在の列値>'< です。DBCC の実行が完了しました。DBCC でエラー メッセージが出力された場合は、システム管理者に問い合わせてください。が で指定NORESEEDされている場合、2 番目のパラメーターを指定しない場合、または再シード値がない場合DBCC CHECKIDENT、メッセージは変更されません。 詳細については、「DBCC CHECKIDENT (Transact-SQL)」をご覧ください。

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

XML データ型と null 値を exist() 0 (ゼロ) と比較すると、関数の動作が変更されました。 次の例を確認してください。

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 2014 におけるデータベース エンジン機能の重大な変更
SQL Server 2014 データベース エンジンの非推奨の機能
SQL Server 2014 で廃止されたデータベース エンジンの機能
ALTER DATABASE 互換性レベル (Transact-SQL)