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

このトピックでは、SQL Server 2012 データベース エンジン および以前のバージョンの SQL Server に関する重要な変更について説明します。 これらの変更によって、以前のバージョンの SQL Server に基づくアプリケーション、スクリプト、または機能を使用できなくなる場合があります。 この問題は、アップグレードするときに発生することがあります。 詳細については、「アップグレード アドバイザーを使用したアップグレードの準備」を参照してください。

このトピックの内容

SQL Server 2012 における重大な変更

SQL Server 2008/SQL Server 2008R2 における重大な変更

SQL Server 2005 における重大な変更

SQL Server 2012 における重大な変更

Transact-SQL

変更点

説明

NEXT という名前の列またはテーブルから選択する

シーケンスでは、ANSI 標準の NEXT VALUE FOR 関数が使用されます。 テーブルまたは列の名前が NEXT で、テーブルまたは列の別名として VALUE が指定されている場合や、ANSI 標準の AS が省略されている場合、作成されたステートメントによってエラーが発生する可能性があります。 問題を回避するには、ANSI 標準の AS キーワードを含めます。 たとえば、SELECT NEXT VALUE FROM Table は SELECT NEXT AS VALUE FROM Table に書き直す必要があり、SELECT Col1 FROM NEXT VALUE は SELECT Col1 FROM NEXT AS VALUE に書き直す必要があります。

PIVOT 演算子

PIVOT 演算子は、データベースの互換性レベルが 110 に設定されている場合、再帰共通テーブル式 (CTE) クエリでは許可されません。 クエリを書き直すか、または互換性レベルを 100 以下に変更してください。 再帰 CTE クエリで PIVOT を使用すると、グループごとに複数の行がある場合に、誤った結果が返されます。

sp_setapprole と sp_unsetapprole

sp_setapprole に対するクッキー パラメーターである OUTPUT は、現在、適切な最大長である varbinary(8000) としてドキュメントに記載されています。 ただし、現在の実装では varbinary(50) を返します。 将来のリリースでクッキーの戻り値のサイズが増えた場合にアプリケーションが引き続き正常に動作するように、アプリケーションでは varbinary(8000) を継続して予約しておく必要があります。 詳細については、「sp_setapprole (Transact-SQL)」を参照してください。

EXECUTE AS

EXECUTE AS のクッキーの OUTPUT パラメーターは現在、適切な最大長である varbinary(8000) としてドキュメントに記載されています。 ただし、現在の実装では varbinary(100) を返します。 将来のリリースでクッキーの戻り値のサイズが増えた場合にアプリケーションが引き続き正常に動作するように、アプリケーションでは varbinary(8000) を継続して予約しておく必要があります。 詳細については、「EXECUTE AS (Transact-SQL)」を参照してください。

sys.fn_get_audit_file 関数

ユーザー定義の監査イベントをサポートするために、2 つの列 (user_defined_event_iduser_defined_information) が追加されました。 名前で列を選択しないアプリケーションは、予想よりも多くの列を返す場合があります。 名前で列を選択するか、これらの追加列を受け入れるようにアプリケーションを調整してください。

time または datetime2 型の計算列に対する CAST および CONVERT 操作

以前のバージョンの SQL Server では、time および datetime2 データ型に対する CAST および CONVERT 操作の既定のスタイルは、いずれかの型が計算列の式で使用されている場合を除き、121 です。 計算列の場合、既定のスタイルは 0 です。 この動作は、計算列が作成されるとき、自動パラメーター化を含むクエリで使用されるとき、または制約の定義で使用されるときに、計算列に影響を与えます。

互換性レベル 110 では、time および datetime2 データ型に対する CAST および CONVERT 操作の既定のスタイルは常に 121 です。 クエリが古い動作に依存する場合は、110 より小さい互換性レベルを使用するか、または影響を受けるクエリで 0 スタイルを明示的に指定してください。

データベースを互換性レベル 110 にアップグレードしても、ディスクに格納されているユーザー データは変更されません。 このようなデータは手動で適切に修正する必要があります。 たとえば、SELECT INTO を使用して、前に説明した計算列の式を含むソースからテーブルを作成した場合は、計算列の定義自体ではなく、(スタイル 0 を使用する) データが格納されます。 このようなデータは、手動で更新してスタイル 121 に一致させる必要があります。

ALTER TABLE

ALTER TABLE ステートメントでは、2 部構成 (schema.object) のテーブル名だけを使用できます。 現在、次の形式を使用してテーブル名を指定すると、コンパイル時にエラー 117 で失敗します。

  • server.database.schema.table

  • .database.schema.table

  • ..schema.table

以前のバージョンでは、server.database.schema.table という形式を指定すると、エラー 4902 が返されました。 .database.schema.table または ..schema.table という形式を指定すると、成功しました。

問題を解決するには、4 部構成のプレフィックスの使用を削除してください。

メタデータの参照

FOR BROWSE または SET NO_BROWSETABLE ON を使用してビューをクエリすると、基になるオブジェクトのメタデータではなく、ビューのメタデータが返されるようになりました。 この動作は現在、他のメタデータ参照方法と一致します。

SOUNDEX

データベース互換性レベル 110 では、SOUNDEX 関数は新しいルールを実装します。このため、関数により求められた値が、110 未満の互換性レベルで計算された値と異なる結果になる場合があります。 互換性レベル 110 へのアップグレード後に、SOUNDEX 関数を使用するインデックス、ヒープ、または CHECK 制約の再構築が必要になる場合があります。 詳細については、「SOUNDEX (Transact-SQL)」を参照してください。

失敗した DML ステートメントの行数メッセージ

SQL Server 2012 では、DML ステートメントが失敗した場合、データベース エンジン は一貫して RowCount: 0 の TDS DONE トークンをクライアントに送信します。 以前のバージョンの SQL Server では、失敗する DML ステートメントが TRY-CATCH ブロックに含まれていて、それが データベース エンジン によって自動パラメーター化されるか、または TRY-CATCH ブロックが失敗したステートメントと同じレベルにない場合、-1 という間違った値がクライアントに送信されます。 たとえば、TRY-CATCH ブロックがストアド プロシージャを呼び出し、そのプロシージャ内の DML ステートメントが失敗した場合、クライアントは -1 という間違った値を受け取ります。

この不適切な動作に依存するアプリケーションは失敗します。

SERVERPROPERTY (‘Edition’)

SQL Server 2012 インスタンスのインストールされている製品のエディション。 このプロパティの値を使用すると、インストールされている製品でサポートされている CPU の最大数など、機能や制限を確認できます。

インストールされている Enterprise のエディションに基づいて、"Enterprise Edition" または "Enterprise Edition: Core-based Licensing" が返されることがあります。 Enterprise のエディションは、SQL Server の単一のインスタンスによる最大計算容量に基づいて区別されます。 SQL Server 2012 の計算容量制限の詳細については、「SQLServer のエディション別の計算容量制限」を参照してください。

CREATE LOGIN

CREATE LOGIN WITH PASSWORD = 'password' HASHED オプションは SQL Server 7 以前で作成されたハッシュでは使用できません。

datetimeoffset の CAST 操作と CONVERT 操作

日付型と時刻型を datetimeoffset に変換するときにサポートされているスタイルは、0 または 1 のみです。 他のすべての変換スタイルでは 9809 が返されます。 たとえば、次のコードではエラー 9809 が返されます。

SELECT CONVERT(date, CAST('7070-11-25 16:25:01.00986 -02:07' as datetimeoffset(5)), 107);

SET ROWCOUNT

SET ROWCOUNT の動作は、多くの一般的なクエリの効率が向上するように変更され、これにより互換性レベル 110 以上のクエリ プランに影響する場合があります。 SET ROWCOUNT ステートメントが DECLARE CURSOR ステートメントの後、FETCH の前の ROWCOUNT 値を 0 に変更するか、0 から変更すると、エラーが発生する場合があります。 このエラーを回避するには、データベースの互換性レベルを 100 に設定するか、ROWCOUNT を cursor ステートメントの外側に設定します。

動的管理ビュー

表示

説明

sys.dm_exec_requests

command 列が nvarchar(16) から nvarchar(32) に変更されました。

sys.dm_os_memory_cache_counters

以下の列の名前が変更されました。

以前の列名

新しい列名

single_pages_kb

pages_kb

multi_pages_kb

pages_in_use_kb

sys.dm_os_memory_cache_entries

pages_allocated_count 列は、pages_kb という名前に変更されました。

sys.dm_os_memory_clerks

multi_pages_kb 列は削除されました。

single_pages_kb 列は、pages_kb という名前に変更されました。

sys.dm_os_memory_nodes

以下の列の名前が変更されました。

以前の列名

新しい列名

single_pages_kb

pages_kb

multi_pages_kb

foreign_committed_kb

sys.dm_os_memory_objects

以下の列の名前が変更されました。

以前の列名

新しい列名

pages_allocated_count

pages_in_bytes

max_pages_allocated_count

max_pages_in_bytes

sys.dm_os_sys_info

以下の列の名前が変更されました。

以前の列名

新しい列名

physical_memory_in_bytes

physical_memory_kb

bpool_commit_target

committed_target_kb

bpool_visible

visible_target_kb

virtual_memory_in_bytes

virtual_memory_kb

bpool_commited

committed_kb

sys.dm_os_workers

ロケール列は削除されました。

カタログ ビュー

表示

説明

sys.data_spaces

sys.partition_schemes

sys.filegroups

sys.partition_functions

sys.data_spaces と sys.partition_functions に、新しい列 (is_system) が追加されました (sys.partition_schemes と sys.filegroups は、sys.data_spaces の列を継承します)。

この列では、値 1 は、そのオブジェクトがフルテキスト インデックス フラグメントに使用されることを示します。

sys.partition_functions、sys.partition_schemes、および sys.filegroups では、この新しい列は末尾の列ではありません。 これらのカタログ ビューから返される列の順序に依存する既存のクエリを修正してください。

SQL CLR データ型 (geometry、geography、および hierarchyid)

Microsoft.SqlServer.Types.dll アセンブリ (空間データ型と hierarchyid 型を含んでいる) は、バージョン 10.0 からバージョン 11.0 にアップグレードされました。 このアセンブリを参照するカスタム アプリケーションは、次の条件に該当する場合に失敗します。

  • カスタム アプリケーションを、SQL Server 2008 R2 がインストールされているコンピューターから SQL Server 2012 のみがインストールされているコンピューターに移動すると、参照されるバージョン 10.0 の SqlTypes アセンブリが存在しないため、アプリケーションが失敗します。 この場合、次のエラー メッセージが返されることがあります:“Could not load file or assembly 'Microsoft.SqlServer.Types, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.”

  • SqlTypes アセンブリ バージョン 11.0 を参照する場合にバージョン 10.0 もインストールされていると、このエラー メッセージが表示されることがあります。“System.InvalidCastException: Unable to cast object of type 'Microsoft.SqlServer.Types.SqlGeometry' to type 'Microsoft.SqlServer.Types.SqlGeometry'.”

  • .NET 3.5、4、または 4.5 をターゲットとするカスタム アプリケーションからバージョン 11.0 の SqlTypes アセンブリを参照すると、SqlClient が仕様によってバージョン 10.0 のアセンブリを読み込むため、アプリケーションが失敗します。 このエラーは、アプリケーションが次のいずれかのメソッドを呼び出したときに発生します。

    • SqlDataReader クラスの GetValue メソッド

    • SqlDataReader クラスの GetValues メソッド

    • SqlDataReader クラスの角かっこインデックス演算子 []

    • SqlCommand クラスの ExecuteScalar メソッド

この問題は、次のいずれかの方法を使用して回避できます。

  • この問題を回避するには、コード内で、上にリストされている Get メソッドの代わりに GetSqlBytes メソッドを呼び出して、CLR SQL Server システム型を取得します。次に例を示します。

    string query = "SELECT [SpatialColumn] FROM [SpatialTable]";
          using (SqlConnection conn = new SqlConnection("..."))
          {
                SqlCommand cmd = new SqlCommand(query, conn);
    
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();
    
                while (reader.Read())
                {
                      // In version 11.0 only
                      SqlGeometry g = 
    SqlGeometry.Deserialize(reader.GetSqlBytes(0));
    
                      // In version 10.0 or 11.0
                      SqlGeometry g2 = new SqlGeometry();
                      g.Read(new BinaryReader(reader.GetSqlBytes(0).Stream));
                }
          }
    
  • この問題を回避するには、アプリケーション構成ファイル内でアセンブリのリダイレクトを使用します。次に例を示します。

    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        ...
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="10.0.0.0" newVersion="11.0.0.0" />
        </dependentAssembly>
        ...
    </assemblyBinding>
    <runtime>
    
  • この問題を回避するには、接続文字列内で、"Type System Version" 属性の値を "SQL Server 2012" と指定することにより、SqlClient がバージョン 11.0 のアセンブリを読み込むようにします。 この接続文字列属性は、.NET 4.5 以上でのみ使用可能です。

  • assemblyBinding タグは runtime タグの下に含める必要があります。

AWE のサポート

32 ビット Address Windowing Extensions (AWE) のサポートは廃止されました。 これにより、32 ビット オペレーティング システム上でのパフォーマンスが低下する可能性があります。 大量のメモリを使用するインストールについては、64 ビット オペレーティング システムに移行してください。

サロゲート対応の XQuery 関数

W3C 勧告では、XQuery 関数および演算子は、上位 Unicode 文字を表すサロゲート ペアを UTF-16 エンコードの単一グリフとしてカウントするよう要求されています。 しかし、SQL Server 2012 以前のバージョンの SQL Server では、文字列関数はサロゲート ペアを単一の文字として認識しません。 一部の文字列操作 (文字列長の計算やサブストリングの抽出など) では、正しくない結果が返されていました。 SQL Server 2012 では、UTF-16 と、サロゲート ペアの正しい処理が完全にサポートされるようになりました。

SQL Server の XML データ型では、整形式のサロゲート ペアのみが許可されます。 ただし、一部の関数では、一定の状況下において、未定義または予期しない結果が依然として返されることがあります。これは、無効または部分的なサロゲート ペアが XQuery 関数に文字列値として渡される可能性があるためです。 SQL Server で XQuery を使用する場合は、次の方法で文字列値を生成することを検討してください。

  • 定数文字列値をバイナリ値として提供する。 この方法を使用した場合、無効または部分的なサロゲート ペアが渡される可能性は残ります。

  • 定数文字列値を、文字エンティティを提供することによって提供する。 この方法を使用した場合、無効なサロゲート ペアを渡すことはできなくなります。 XQuery 関数では、高レベルの文字に単一の文字エンティティを使用する必要があります。 これらの関数では、サロゲート ペア文字用の文字エンティティが提供された場合にエラーが発生します。

  • sql:column または sql:variable を使用して外部の値をインポートしてください。 これらの方法を使用した場合、無効または部分的なサロゲート ペアが使用される可能性は残ります。

影響を受ける XQuery 関数と演算子

次の XQuery 関数および演算子は、SQL Server 2012 では UTF-16 のサロゲート ペアを正しく処理するようになりました。

  • fn:string-length。 ただし、無効または部分的なサロゲート ペアが引数として渡された場合、string-length の動作は未定義です。

  • fn:substring

  • fn:contains。 ただし、部分的なサロゲート ペアが値として渡された場合、contains は予期しない結果を返すことがあります。これは、整形式のサロゲート ペアに含まれている部分的なサロゲート ペアが検出される可能性があるためです。

  • fn:concat。 ただし、部分的なサロゲート ペアが値として渡された場合、concat は正しくないサロゲート ペアか、または部分的なサロゲート ペアを生成することがあります。

  • 比較演算子と order by 句。 比較演算子には、+、<、>、<=、>=、eq、lt、gt、le、および ge が含まれます。

システム プロシージャへの分散クエリ呼び出し

OPENQUERY を通じた一部のシステム プロシージャへの分散クエリ呼び出しは、 から別のサーバーへの呼び出しである場合に失敗します。 これは、データベース エンジンがプロシージャのメタデータを検出できない場合に発生します。 たとえば、SELECT * FROM OPENQUERY(..., 'EXEC xp_loginfo') のようにします。

旧バージョンとの互換性

新しい動作は互換性レベルに依存します

次の関数と演算子は、互換性レベルが 110 以上の場合にのみ、上記の新しい動作を示します。

  • fn:contains

  • fn:concat

  • 比較演算子と order by 句。

新しい動作は、関数の既定の名前空間 URI に依存します

次の関数は、既定の名前空間 URI が最終的な推奨設定の名前空間 (つまり、http://www.w3.org/2005/xpath-functions) に対応している場合にのみ、上記の新しい動作を示します。 互換性レベルが 110 以上の場合、既定では、SQL Server 2012 は既定の関数名前空間をこの名前空間にバインドします。 ただし、これらの関数は、この名前空間が互換性レベルにかかわらず使用される場合にのみ、新しい動作を示します。

  • fn:string-length

  • fn:substring

[トップに戻る] リンクで使用される矢印アイコントップに戻る

SQL Server 2008/SQL Server 2008R2 における重大な変更

このセクションでは、SQL Server 2008 で導入された重大な変更について説明します。 SQL Server 2008 R2 で導入された変更はありません。

照合順序

変更点

説明

新しい照合順序

SQL Server 2008 では、Windows Server 2008 が提供する照合順序に完全に対応する新しい照合順序が導入されています。 この 80 個の新しい照合順序は、言語面での精度が向上しており、*_100 というバージョン参照で示されます。 サーバーまたはデータベースに新しい照合順序を選択する場合は、古いクライアント ドライバーを使用するクライアントではその照合順序が認識されない可能性があることに注意してください。 照合順序が認識されないと、アプリケーションはエラーを返して失敗する場合があります。 次の解決策を検討してください。

  • クライアント オペレーティング システムをアップグレードして、基になるシステムの照合順序を更新する。

  • クライアントにデータベース クライアント ソフトウェアがインストールされている場合、データベース クライアント ソフトウェアにサービスの更新プログラムを適用する。

  • クライアントのコード ページにマップする既存の照合順序を選択する。

共通言語ランタイム (CLR)

変更点

説明

CLR アセンブリ

データベースを SQL Server 2008 にアップグレードすると、新しいデータ型をサポートする Microsoft.SqlServer.Types アセンブリが自動的にインストールされます。 アップグレード アドバイザーのルールにより、競合する名前を持つユーザー型またはアセンブリが検出されます。 アップグレード アドバイザーは、次のいずれかの方法によって、競合するアセンブリの名前の変更を推奨します。2 つの方法とは、競合する型の名前を変更するか、または 2 つの部分から構成される名前をコード内で使用して既存のユーザー型を参照するかのどちらかです。

データベースのアップグレード時に競合する名前を持つユーザー アセンブリが検出されると、このアセンブリの名前が自動的に変更され、データベースが問題のあるモードになります。

アップグレード時に競合する名前を持つユーザー型が検出された場合、特別な処理は実行されません。 アップグレード後は、古いユーザー型と新しいシステム型の両方が存在することになります。 ユーザー型は、2 つの部分から構成される名前を介してのみ使用できます。

CLR アセンブリ

SQL Server 2008 では .NET Framework 3.5 SP1 がインストールされ、グローバル アセンブリ キャッシュ (GAC) 内のライブラリが更新されます。 SQL Server データベースにサポートされていないライブラリが登録されている場合、SQL Server 2008 にアップグレードすると、SQL Server アプリケーションの動作が停止する可能性があります。 これは、GAC でライブラリを提供またはアップグレードしても SQL Server 内でアセンブリが更新されないためです。 アセンブリが SQL Server データベースと GAC の両方に存在する場合、アセンブリの 2 つのコピーが完全に一致する必要があります。 一致しない場合、SQL Server CLR 統合によってアセンブリが使用されたときにエラーが発生します。 詳細については、「サポートされている .NET Framework ライブラリ」を参照してください。

データベースをアップグレードした後、ALTER ASSEMBLY ステートメントを使用して、SQL Server データベース内でアセンブリのコピーを提供またはアップグレードします。 詳細については、サポート技術情報の記事 949080 を参照してください。

サポートされていない .NET Framework ライブラリをアプリケーションで使用しているかどうかを検出するには、データベースで次のクエリを実行します。

SELECT name FROM sys.assemblies WHERE clr_name LIKE '%publickeytoken=b03f5f7f11d50a3a,%';

CLR ルーチン

CLR のユーザー定義関数、ユーザー定義集計、またはユーザー定義型 (UDT) 内で権限借用を使用すると、SQL Server 2008 にアップグレードした後に、アプリケーションがエラー 6522 で失敗する可能性があります。

次のシナリオは、SQL Server 2005 では成功しますが、SQL Server 2008 では失敗します。 それぞれのシナリオに解決策があります。

  1. 権限借用を使用する CLR のユーザー定義関数、ユーザー定義集計、または UDT メソッドで、nvarchar(max)、varchar(max)、varbinary(max)、ntext、text、image のいずれかの型のパラメーターまたは大きな UDT が使用されているが、メソッドに DataAccessKind.Read 属性が指定されていない。

    この問題を解決するには、DataAccessKind.Read 属性をメソッドに追加し、アセンブリを再コンパイルしたうえで、ルーチンとアセンブリを再配置します。

  2. CLR テーブル値関数で、権限借用を実行する Init メソッドが使用されている。

    この問題を解決するには、DataAccessKind.Read 属性をメソッドに追加し、アセンブリを再コンパイルしたうえで、ルーチンとアセンブリを再配置します。

  3. CLR テーブル値関数で、権限借用を実行する FillRow メソッドが使用されている。

    この問題を解決するには、FillRow メソッドから権限借用を削除します。 外部リソースへのアクセスには FillRow メソッドを使用しないでください。 代わりに Init メソッドから外部リソースにアクセスします。

動的管理ビュー

表示

説明

sys.dm_os_sys_info

cpu_ticks_in_ms 列および sqlserver_start_time_cpu_ticks 列を削除しました。

sys.dm_exec_query_resource_semaphores sys.dm_exec_query_memory_grants

resource_semaphore_id 列は、SQL Server 2008 で一意の ID ではありません。 この変更は、クエリの実行のトラブルシューティングに影響する可能性があります。 詳細については、「sys.dm_exec_query_resource_semaphores (Transact-SQL)」を参照してください。

エラーとイベント

変更点

説明

ログイン エラー

SQL Server 2005 では、Windows 認証のみを使用するように構成されたサーバーに接続する際に SQL ログインを使用すると、エラー 18452 が返されます。 SQL Server 2008 では、代わりに、エラー 18456 が返されます。

Showplan

変更点

説明

プラン表示の XML スキーマ

新しい SeekPredicateNew 要素はプラン表示の XML スキーマに追加され、囲み要素である xsd sequence (SqlPredicatesType) は <xsd:choice> アイテムに変換されます。 プラン表示の XML には、1 つ以上の SeekPredicate 要素ではなく、1 つ以上の SeekPredicateNew 要素を表示することもできます。 この 2 つの要素を同時に指定することはできません。 旧バージョンとの互換性のために、SeekPredicate はプラン表示の XML スキーマに保持されていますが、SQL Server 2008 で作成されたクエリ プランには SeekPredicateNew 要素を含めることができます。 ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/IndexScan/SeekPredicates ノードから SeekPredicate 子要素のみを取得するアプリケーションは、SeekPredicate 要素が存在しない場合、失敗する可能性があります。 このノードの SeekPredicate 要素または SeekPredicateNew 要素のいずれかを取得するようにアプリケーションを書き直してください。 詳細については、以下のトピックを参照してください。

プラン表示の XML スキーマ

プラン表示の XML スキーマの ObjectType 複合型に、新しい IndexKind 属性が追加されます。 SQL Server プランを SQL Server 2005 スキーマに対して厳密に検証するアプリケーションは失敗します。

Transact-SQL

変更点

説明

ALTER_AUTHORIZATION_DATABASE DDL イベント

SQL Server 2005 では、DDL イベント ALTER_AUTHORIZATION_DATABASE が発生すると、データ定義言語 (DDL) 操作においてセキュリティ保護可能なエンティティの種類がオブジェクトの場合、このイベントの EVENTDATA xml の ObjectType 要素に値 'object' が返されます。 SQL Server 2008 では、実際の種類 (たとえば 'table' や 'function') が返されます。

CONVERT

CONVERT 関数に無効なスタイルが渡されると、変換の種類がバイナリから文字、または文字からバイナリの場合にエラーが返されます。 以前のバージョンの SQL Server では、バイナリから文字への変換および文字からバイナリへの変換の既定のスタイルに無効なスタイルが設定されます。

アセンブリに対する EXECUTE の GRANT/DENY/REVOKE

アセンブリに対する EXECUTE 権限の許可、拒否、および取り消しを行うことはできません。 この権限を設定しても効果がなく、エラーが発生します。 代わりに、アセンブリ メソッドを参照するストアド プロシージャまたは関数に対して EXECUTE 権限の許可、拒否、および取り消しを行ってください。

システム型に対する GRANT/DENY/REVOKE 権限

システム型に対する権限の許可、拒否、および取り消しを行うことはできません。 以前のバージョンの SQL Server では、このステートメントは正常に実行されますが、効果はありません。 SQL Server 2008 では、エラーが返されます。

GROUP BY

GROUP BY 句では、GROUP BY リストに使用される式にサブクエリを含めることはできません。 以前のバージョンの SQL Server では、この処理は可能でした。 SQL Server 2008 では、エラー 144 が返されます。

たとえば、次のコードは、SQL Server 2005 では正常に実行されますが、SQL Server 2008 では実行に失敗します。

DECLARE @Test TABLE(a int NOT NULL);
INSERT INTO @Test SELECT 1 union ALL SELECT 2;
SELECT COUNT(*) 
FROM @Test
GROUP BY CASE WHEN a IN (SELECT t.a FROM @Test AS t)
THEN 1 ELSE 0 
END;

OUTPUT 句

非決定的な動作を防ぐために、ビューまたはインライン テーブル値関数から返される列が次のいずれかの方法で定義されている場合、OUTPUT 句ではその列を参照できません。

  • サブクエリ

  • ユーザー データやシステム データにアクセスするユーザー定義関数、またはそのようなアクセスを行うと想定されるユーザー定義関数

  • ユーザー データまたはシステム データにアクセスするユーザー定義関数を定義に含む計算列

SQL Server が OUTPUT 句でそのような列を検出すると、エラー 4186 が発生します。 詳細については、「MSSQLSERVER_4186」を参照してください。

OUTPUT INTO 句

OUTPUT INTO 句の対象のテーブルに有効なトリガーを指定することはできません。

precompute rank サーバー レベル オプション

このオプションは、SQL Server 2008 ではサポートされていません。 この機能を現在使用しているアプリケーションはできるだけ早く変更してください。

READPAST テーブル ヒント

スナップショット分離で READPAST ヒントを指定することはできません。

READ_COMMITED_SNAPSHOT データベース オプションまたは ALLOW_SNAPSHOT_ISOLATION データベース オプションのいずれかが ON に設定されている場合、READPAST ヒントは無視されます。 ただし、READPAST ヒントを READCOMMITTEDLOCK と組み合わせた場合、READPAST の動作は READCOMMITTED ヒントをブロックするのと同じになります。

sp_helpuser

sp_helpuser ストアド プロシージャの結果セットに返される次の列名が変更されました。

以前の列名

新しい列名

GroupName

RoleName

Group_name

Role_name

Group_id

Role_id

Users_in_group

Users_in_role

透過的なデータ暗号化

透過的なデータ暗号化 (TDE) は I/O レベルで実行されます。そのため、ページ構造は、メモリ内では暗号化されず、ページがディスクに書き込まれるときだけ暗号化されます。 データベース ファイルとログ ファイルの両方が暗号化されます。 通常の SQL Server メカニズムを使用せずに (たとえば、データ ファイルやログ ファイルを直接スキャンして) ページにアクセスするサードパーティのアプリケーションは、ファイル内のデータが暗号化されているため、データベースで TDE を使用すると失敗します。 このようなアプリケーションでは、Window Cryptographic API を使用すると、SQL Server 以外のデータの暗号化を解除するためのソリューションを開発できます。

XQuery

変更点

説明

Datetime のサポート

SQL Server 2005 では、xs:time、xs:date、および xs:dateTime の各データ型がタイム ゾーンをサポートしていません。 タイム ゾーン データは UTC タイム ゾーンにマップされます。 SQL Server 2008 では、標準に準拠した動作を提供するため、次のように変更されました。

  • タイム ゾーンを使用しない値の検証

  • タイム ゾーン指定の有無の保持

  • 内部ストレージ表現の変更

  • 格納された値の解決を増加

  • 負の年の使用禁止

アプリケーションと XQuery 式を変更して、新しい型の値を反映してください。

XQuery 式と Xpath 式

SQL Server 2005 の XQuery 式または XPath 式では、コロン (:) で始まるステップが許可されます。 たとえば、次のステートメントのパス式には、コロンで始まる名前テスト (CTR02) が含まれています。

SELECT FileContext.query('for n$ in //CTR return <C>{data )(n$/:CTR02)} </C>) AS Files FROM dbo.MyTable;

この使用法は XML 標準に準拠していないため、SQL Server 2008 では許可されません。 エラー 9341 が返されます。 先頭のコロンを削除するか、名前テストにプレフィックスを指定してください (n$/CTR02 や n$/p1:CTR02 など)。

Connecting

変更点

説明

SSL を使用した SQL Server Native Client からの接続

SQL Server Native Client を使用して接続するとき、以前は、緩和された検証により、サブジェクトに完全修飾ドメイン名 (FQDN) が指定されている証明書で "SERVER=shortname; FORCE ENCRYPTION=true" を使用するアプリケーションでも接続できましたが、 SQL Server 2008 R2 では、セキュリティ強化のために証明書で FQDN のサブジェクトが強制されるようになりました。 緩和された検証に依存しているアプリケーションでは次のいずれかの対処が必要になります。

  • 接続文字列で FQDN を使用する。

    • この方法を使用する場合は、接続文字列の SERVER キーワードがアプリケーションの外部で構成されていればアプリケーションを再コンパイルする必要はありません。

    • この方法は、接続文字列がハードコードされているアプリケーションには使用できません。

    • この方法は、データベース ミラーリングを使用するアプリケーションには使用できません (ミラー化されたサーバーは簡易名を使用して応答するため)。

  • shortname の別名を追加して FQDN にマップする。

    • この方法は、接続文字列がハードコードされているアプリケーションにも使用できます。

    • この方法は、データベース ミラーリングを使用するアプリケーションには使用できません (プロバイダーは、受け取ったフェールオーバー パートナー名の別名を参照しないため)。

  • shortname に対して発行された証明書を使用する。

    • この方法は、すべてのアプリケーションに使用できます。

[トップに戻る] リンクで使用される矢印アイコントップに戻る

SQL Server 2005 における重大な変更

SQL Server 2005 で導入された重大な変更の詳細については、「SQL Server 2005 におけるデータベース エンジン機能の重大な変更」を参照してください。

関連項目

参照

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

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

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

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

その他の技術情報

SQL Server データベース エンジンの旧バージョンとの互換性