sp_dbcmptlevel (Transact-SQL)

更新 : 2006 年 7 月 17 日

データベースの特定の動作を、指定したバージョンの SQL Server と互換性のある動作に設定します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

sp_dbcmptlevel [ [ @dbname = ] name ] 
    [ , [ @new_cmptlevel = ] version ]

引数

  • [ @dbname= ] name
    互換性レベルを変更するデータベースの名前を指定します。データベース名は識別子の規則に従っている必要があります。name のデータ型は sysname で、既定値は NULL です。
  • [ @new_cmptlevel= ] version
    データベースの互換性の対象となる SQL Server のバージョンを指定します。version のデータ型は tinyint で、既定値は NULL です。次のいずれかの値を指定する必要があります。

    60 = SQL Server 6.0

    65 = SQL Server 6.5

    70 = SQL Server 7.0

    80 = SQL Server 2000

    90 = SQL Server 2005

    ms178653.note(ja-jp,SQL.90).gifメモ :
    6065 は推奨されません。これらは将来のリリースで削除される予定です。
    ms178653.Caution(ja-jp,SQL.90).gif注意 :
    SQL Server Management Studio および SQL Server 管理オブジェクト (SMO) では、互換性レベル 60 はサポートされていません。SMO または Management Studio を、互換性レベル 60 に設定されたデータベースと共に使用すると、操作によってはエラーが発生します。

リターン コードの値

0 (成功) または 1 (失敗)

結果セット

パラメータを 1 つも指定しないか、name パラメータを指定しなかった場合、sp_dbcmptlevel はエラーを返します。

version を指定せずに name を指定した場合、SQL Server 2005 データベース エンジンでは指定したデータベースの現在の互換性レベルを示すメッセージが返されます。

解説

SQL Server 2005 のすべてのインストールで、既定の互換性レベルは 90 です。SQL Server 2005 で作成されたデータベースは、モデル データベースの互換性レベルがこれより低い場合を除き、このレベルに設定されます。以前のバージョンの SQL Server から SQL Server 2005 にデータベースをアップグレードした場合、データベースではそれまでの互換性レベルが保持されます。これはシステム データベースとユーザー データベースの両方に適用されます。データベースの互換性レベルを 90 に変更するには、sp_dbcmptlevel を使用します。データベースの現在の互換性レベルを確認するには、sys.databases カタログ ビューの compatibility_level 列をクエリします。

旧バージョンとの互換性を維持するための sp_dbcmptlevel の使用

sp_dbcmptlevel ストアド プロシージャは、サーバー全体ではなく、指定したデータベースの動作にのみ影響します。sp_dbcmptlevel では、以前のバージョンの SQL Server との部分的な互換性だけが提供されます。sp_dbcmptlevel は、移行時の暫定的な手段として使用してください。互換性レベルの設定により動作を制御することで、バージョン間の動作の違いに対処することができます。SQL Server 2005 での動作の違いによって既存の SQL Server アプリケーションに影響が生じる場合は、適切に動作するようアプリケーションを変換した後、sp_dbcmptlevel を使用して互換性レベルを 90 に変更します。データベースの新しい互換性設定は、次回データベースが現行になったとき (ログイン時に既定のデータベースとして使用されるか、USE ステートメントで指定されたとき) に有効になります。

インデックス付きビューを含むデータベースは、80 より低い互換性レベルには変更できません。

推奨事項

ユーザーがデータベースに接続しているときに互換性レベルを変更すると、アクティブなクエリに対し誤った結果セットが生成される可能性があります。たとえば、クエリ プランのコンパイル中に互換性レベルを変更すると、コンパイルされるプランは変更前の互換性レベルと変更後の互換性レベルの両方に基づいてしまう場合があります。その結果、誤ったプランが生成され、不正確な結果が発生する可能性があります。さらに、プランがプラン キャッシュに置かれ後続のクエリにより再使用された場合、問題が複雑になることが考えられます。不正確なクエリ結果を避けるため、データベースの互換性レベルを変更するときには次の手順に従うことをお勧めします。

  1. ALTER DATABASE SET SINGLE_USER を使用してデータベースをシングル ユーザー アクセス モードに設定します。
  2. データベースの互換性レベルを変更します。
  3. ALTER DATABASE SET MULTI_USER を使用してデータベースをマルチユーザー アクセス モードにします。
  4. データベースのアクセス モードの設定に関する詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。

SET オプション

古い (低い) 互換性レベルでも新しい機能が動作する場合もありますが、SET オプションを使用するには調整が必要になることがあります。たとえば、互換性レベル 80 で xml データ型を使用すると、適切な ANSI SET オプションが必要になります。またデータベースの互換性レベル 90 で ANSI_WARNINGS を ON に設定すると、暗黙的に ARITHABORT が ON に設定されます。データベース互換性レベルが 80 以下に設定されている場合は、ARITHABORT オプションを明示的に ON に設定する必要があります。詳細については、「結果に影響を与える SET オプション」を参照してください。

互換性レベルとストアド プロシージャ

ストアド プロシージャを実行すると、そのストアド プロシージャが定義されているデータベースの現在の互換性レベルが使用されます。データベースの互換性設定が変更された場合、そのデータベースのすべてのストアド プロシージャは、設定に合わせて自動的に再コンパイルされます。

sp_dbcmptlevel を使用する場合の環境要件

それぞれの sp_dbcmptlevel 呼び出しは個別に送信する必要があります。次に示すような他のコンテキスト内からは、sp_dbcmptlevel を呼び出すことはできません。

  • ストアド プロシージャ
  • EXEC (string) 構文で実行される Transact-SQL 文字列
  • Transact-SQL ステートメントのバッチ

レベル 60/65 とレベル 70/80/90 との動作の相違点

互換性レベルを 60 または 65 に設定すると、多くの動作に影響します。そのうち一部を、次の表の左の列に示します。

ms178653.note(ja-jp,SQL.90).gifメモ :
6.x アプリケーションに影響するその他の相違点については、後の「レベル 90 とより低い互換性レベルとの相違点」、および「解説」に挙げた、6.x 以降の予約済みキーワードを参照してください。

互換性レベル設定 60 または 65

互換性レベル設定 70 以上

SELECT ステートメントを GROUP BY 句と共に使用し、ORDER BY 句を使用しない場合の結果セットは、GROUP BY 列ごとに並べ替えられます。

GROUP BY 句だけでは、並べ替えが行われません。結果セットの並べ替えを行うには、SQL Server に対して ORDER BY 句を明示的に指定する必要があります。詳細については、「SELECT (Transact-SQL)」を参照してください。

テーブルの別名で始まる列は、UPDATE ステートメントの SET 句で使用できます。

UPDATE ステートメントの SET 句では、テーブルの別名を使用できません。SET 句で指定するテーブルまたはビューは、UPDATE キーワードの直後に指定するテーブルまたはビューと一致する必要があります。詳細については、「UPDATE (Transact-SQL)」を参照してください。

CREATE TABLE または ALTER TABLE で、明示的に NULL または NOT NULL オプションを指定せずに作成された bit 列は、NOT NULL として扱われます。

NULL 値を許容するかどうかが明示的に指定されていない場合、bit 列に NULL 値を許容するかどうかは、SET ANSI_NULL_DFLT_ON または SET ANSI_NULL_DFLT_OFF のセッション設定、または SET ANSI NULL DEFAULT のデータベース設定によって決まります。詳細については、「SET (Transact-SQL)」を参照してください。

ALTER COLUMN 句は ALTER TABLE で使用できません。

ALTER COLUMN 句は ALTER TABLE で使用できます。詳細については、「ALTER TABLE (Transact-SQL)」を参照してください。

テーブルに作成されたトリガは、同じ種類のトリガ (INSERT, UPDATE, DELETE) が既に存在する場合は、既存のトリガの代わりに使用されます。CREATE TRIGGER の WITH APPEND オプションを使用して、同じ種類の複数のトリガを作成できます。

同じ種類のトリガが追加されます。トリガ名は一意でなければなりません。WITH APPEND オプションが既定の動作として想定されます。詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。

バッチまたはプロシージャに無効なオブジェクト名が含まれている場合は、バッチが解析またはコンパイルされたときに警告が返され、バッチが実行されたときにエラー メッセージが返されます。

無効なローカル オブジェクトの場合、バッチを解析またはコンパイルしたときに警告が返されず、バッチを実行したときにエラー メッセージが返されます。

ただし、リモートの無効オブジェクトに対しては、無効なリモート テーブルをプロシージャに使用した場合に名前の遅延解決 (DNR) がサポートされません。このとき、プロシージャの作成が失敗し、エラーが返されます。

ms178653.note(ja-jp,SQL.90).gifメモ :

DNR サポート (実行時まで存在しないオブジェクトを、コンパイル中に参照する機能) は、テーブル名またはビュー名にだけ適用されます。名前の遅延解決の詳細については、「CREATE PROCEDURE (Transact-SQL)」を参照してください。

次の形式のクエリは適切に実行されます。ここではテーブル Y が無視され、SELECT ステートメントの結果がテーブル X に挿入されます。

INSERT X
SELECT select_list INTO Y

Microsoft SQL Server 7.0 以上では、同じクエリを実行すると構文エラーが返されます。

空文字列リテラル (' ') は、空白 1 つとして評価されます。

空文字列リテラル (' ') は、空の文字列として評価されます。

DATALENGTH('') は 1 を返します ('' はスペース 1 つとして解析されます)。

DATALENGTH(N'') は 2 を返します (N''' は Unicode スペース 1 つとして解析されます)。

DATALENGTH('') は 0 を返します。

DATALENGTH(N'') は 0 を返します。

LEFT('123', 0) は NULL を返します。

LEFT(N'123', 0) は NULL を返します。

LEFT('123', 0) は空文字列を返します。

LEFT(N'123', 0) は空文字列を返します。

LTRIM('     ') は NULL を返します。

LTRIM(N'     ') は NULL を返します。

LTRIM('     ') は空文字列を返します。

LTRIM(N'     ') は空文字列を返します。

REPLICATE('123', 0) は NULL を返します。

REPLICATE(N'123', 0) は NULL を返します。

REPLICATE('123', 0) は空文字列を返します。

REPLICATE(N'123', 0) は空文字列を返します。

RIGHT(N'123', 0) は NULL を返します。RIGHT('123', 0) は NULL を返します。

RIGHT('123', integer_expression) は、integer_expression が負の値である場合に NULL を返します。

RIGHT(N'123', integer_expression) は、integer_expression が負の値である場合に NULL を返します。

RIGHT('123', 0) は空文字列を返します。

RIGHT(N'123', 0) は空文字列を返します。

RIGHT('123', integer_expression) は、integer_expression が負の値である場合にエラーを返します。RIGHT(N'123', integer_expression) は、integer_expression が負の値である場合にエラーを返します。

RTRIM('     ') は NULL を返します。

RTRIM(N'     ') は NULL を返します。

RTRIM('     ') は空の文字列を返します。

RTRIM(N'     ') は空の文字列を返します。

SPACE(0) は NULL を返します。

SPACE(0) は空の文字列を返します。

関数 SUBSTRING(expression, start,length) は、expression の文字数より大きな値を start に設定した場合、または length に 0 を設定した場合、NULL を返します。たとえば、SUBSTRING(N'123', 4, 1) は NULL を返します。

左記と同じ条件で、SUBSTRING(expression, start, length) は、単一引用符のペアで区切られた空文字列を返します。たとえば、SUBSTRING(N'123', 4, 1) は '' を返します。

UPDATETEXT table.textcolumn textpointer 0 NULL NULL の結果は、NULL 値になります。

UPDATETEXT table.textcolumn textpointer 0 NULL NULL の結果は、空のテキストになります。

CHARINDEX 関数と PATINDEX 関数は、パターンと式の両方が NULL である場合のみ NULL を返します。

CHARINDEX 関数と PATINDEX 関数は、入力パラメータが NULL である場合に NULL を返します。

inserted テーブルまたは deleted テーブルの text 列または image 列への参照は、NULL として表示されます。

inserted および deleted テーブルの text または image 列への参照は、許可されません。

トリガ内の inserted または deleted テーブルから text または image 列を取得すると、text または image 列に NULL 値が返されます。

トリガ内の inserted または deleted テーブルから text または image 列を取得することは許可されず、エラーが発生します。

UPDATETEXT では、text 列を NULL に初期化できます。

UPDATETEXT では、text 列が空文字列に初期化されます。

WRITETEXT は、text 列を初期化して NULL にします。

sp_dboptionconcatenation of null yields null 設定はオフ (無効) です。これにより、連結演算のオペランドのいずれかが NULL である場合に空文字列が返されます。

sp_dboptionconcat null yields null 設定はオン (有効) です。これにより、連結演算のオペランドのいずれかが NULL である場合に NULL が返されます。

INSERT ステートメントの VALUES 句では、スカラ値を返す SELECT ステートメントを使用できます。

INSERT ステートメントの VALUES 句では、挿入する値の 1 つとして SELECT ステートメントを使用できません。

INSERT table EXEC procedure ステートメントで参照されているストアド プロシージャの ROLLBACK ステートメントは、INSERT ステートメントをロールバックします。ただし、バッチは続行されます。

INSERT...EXEC ステートメントで参照されるストアド プロシージャで ROLLBACK ステートメントを使用すると、トランザクション全体がロールバックされ、バッチの実行は停止します。

レベル 90 とより低い互換性レベルとの相違点

ここでは、互換性レベル 90 に導入された新しい動作について説明します。レベル 80 未満の互換性レベルに影響する動作の相違点については、後の「予約済みキーワード」を参照してください。

互換性レベル 90 では、動作が次のように変更されます。

互換性レベル設定 80 以下

互換性レベル設定 90

影響度

FROM 句のロック ヒントに対して、WITH キーワードは常に省略可能です。

いくつかの例外を除き、テーブル ヒントは、FROM 句で WITH キーワードで指定した場合にのみサポートされます。詳細については、「FROM (Transact-SQL)」を参照してください。

警告メッセージでは、外部結合の演算子 *= および =* がサポートされます。

これらの演算子はサポートされません。OUTER JOIN キーワードを使用してください。

ORDER BY リストにある列参照を SELECT リスト内に定義されている列にバインドする場合、列のあいまいな部分は無視され、場合によっては列プレフィックスも無視されます。これにより、結果セットが予期しない順序で返されることがあります。

たとえば、ORDER BY 句に含まれる 1 つの列が 2 つの要素 (<table_alias>.<column>) で表され、この列が SELECT リストの中で列への参照として使用されている場合、ORDER BY 句は受け付けられますが、テーブルの別名は無視されます。次のクエリを考えてみます。

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

このクエリを実行するとき、ORDER BY で列のプレフィックスは無視されます。指定したソース列 (x.c1) に対しては期待どおりに並べ替え操作が行われず、代わりにクエリ内で定義されている派生列 c1 に対してソートが実行されます。このクエリの実行プランでは、まず派生列の値が計算され、次にその計算値が並べ替えられます。

列のあいまいな部分に関してエラーが発生します。ORDER BY 句に列のプレフィックスが指定されている場合、SELECT リストで定義されている列にバインドするときに、列のプレフィックスは無視されません。

次のクエリを考えてみます。

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

このクエリを実行するとき、ORDER BY 句内の列のプレフィックスは無視されません。指定したソース列 (x.c1) に対し、期待どおりに並べ替え操作が行われます。このクエリの実行プランでは、t_table から返された行を並べ替え操作で整列させた後、SELECT リストで定義されている派生列 c1 の値を計算するようになっています。

異なるデータ型に対する UNION の INSERT SELECT では、UNION の各ブランチは、INSERT の対象列のデータ型に直接キャストされます。互換性のない型を変換したために自己結合が失敗したとしても、UNION の結果の型へのブランチが変換されることはないため、INSERT SELECT によって UNION が正常に行われます。

SQL Server 2005 では、UNION の結果の型は INSERT SELECT とは無関係に派生します。UNION の各ブランチは UNION の結果の型にキャストされた後、INSERT の対象列の型にキャストされます。UNION に互換性のない型がある場合は、最初のキャストでエラーが発生する可能性があります。互換性レベル 90 で実行するには、INSERT SELECT 内で使用されている互換性のないデータ型の結合をすべて修正する必要があります。

WITH CHECK OPTION 句が指定されたビューを介して挿入操作と更新操作を実行しようとしても、そのビューまたは参照先のビューで TOP 句が使用されている場合、操作は適切にサポートされません。

WITH CHECK OPTION 句を使用するビューを介して挿入操作と更新操作を実行しようとしても、そのビューまたは参照先のビューで TOP 句が使用されている場合、操作はサポートされません。

可変長列と固定長列に UNION を実行すると、固定長列が生成されます。

可変長列と固定長列の UNION によって、可変長列が作成されます。

トリガ内で SET XACT_ABORT OFF を使用できます。

トリガ内で SET XACT_ABORT OFF を使用できません。

ビューで FOR BROWSE 句は許可されます (ただし無視されます)。

ビューで FOR BROWSE 句は許可されません。

ドメイン エラーは ANSI_WARNINGS で制御されません。ANSI_WARNINGS が OFF に設定されている場合は、ARITHABORT 設定が優先され、ARITHABORT に変更はありません。

ドメイン エラーは、ANSI_WARNINGS によっても制御される、重大度レベル 16 のエラーです。ANSI_WARNINGS または ARITHABORT が ON の場合は、NULL 値が返されるのではなく、エラーがスローされます。ARITHABORT が OFF に設定されていることを前提としているユーザー スクリプトは、この変更によって壊れる可能性があります。

リモート データ ソースに対してパススルー クエリ (OpenRowset または OpenQuery) を実行し、重複した名前の列が作成された場合、重複した列名は、クエリで明示的に列が指定されない限り無視されます。

リモート データ ソースに対するパススルー クエリ (OpenRowset または OpenQuery) が重複する名前を持つ列を作成する場合、エラーが発生します。

8,000 よりも大きいサイズの文字列定数と varbinary 定数は、textntext、または image として扱われます。

8,000 よりも大きいサイズの文字列定数は nvarchar(max)varbinary 定数は varbinary(max)、あるいはどちらも varchar(max) の型として扱われます。これによって、SELECT リストにこのような式が含まれる場合は、SELECT ... INTO を使用して作成するテーブルのデータ型が変わる可能性があります。

数値型 (smallinttinyintintbigintnumericdecimalsmallmoneymoney) どうしの比較は、データ型階層で優先順位が低い比較値を、優先順位が高い型に変換することによって行われます。

数値型の値は変換せずに比較されます。このため、パフォーマンスが向上します。ただし、変換によってオーバーフローの例外が発生する場合などは、動作が変わる可能性があります。

文字列引数をとる組み込みメタデータ関数は、入力が 4,000 文字より長い場合に入力が切り捨てられます。

組み込みメタデータ関数は、切り捨てによってスペース以外の文字が失われる場合にエラーが発生します。

引用符で囲まれていない識別子に許可されない文字セットがある場合は、変更されません。

Transact-SQL パーサーでは Unicode 3.2 規格がサポートされます。この規格ではいくつかの国際文字の文字分類が変更されており、区切られていない識別子では使用できない文字もあります。

浮動小数点ドメイン エラー (log() 関数に対する負の引数) が発生した場合、SET ANSI_WARNINGS ON の設定は SET ARITHABORT OFF の設定よりも優先されません。ANSI_WARNINGS が ON で ARITHABORT が OFF の場合、浮動小数点ドメイン エラーによってクエリが終了することはありません。

SET ANSI_WARNINGS ON は、ARITHABORT OFF 設定を完全に上書きします。この場合、浮動小数点ドメイン エラーが発生するとクエリが終了します。

ORDER BY 句で整数以外の定数を使用できます (無視されます)。

ORDER BY 句で整数以外の定数を使用できません。

(SET オプションが割り当てられていない) 空の SET ステートメントを使用できます。

空の SET 句は許可されません。

IDENTITY 属性は、派生テーブルによって作成された列に対して正しく派生されません。

IDENTITY 属性は、派生テーブルによって作成された列に対して正しく派生されます。

浮動小数点データ型に対する算術演算子の NULL 値許容プロパティは、常に NULL 値許容です。

浮動小数点データ型に対する算術演算子の NULL 値許容プロパティは、入力が NULL 値非許容であり、かつ ANSI_WARNINGS が ON の場合に NULL 値非許容に変更されます。

UNION を使用する INSERT .. SELECT ステートメントでは、各結果セットによって作成される型がすべて挿入先の結果型に変換されます。

UNION を使用する INSERT .. SELECT ステートメントでは、各種ブランチの主要な型が決定され、結果がその型に変換された後、挿入先のテーブル型に変換されます。

SELECT ..FOR XML ステートメントでは、hex(27) (' 文字) と hex(22) (" 文字) が、必要ない場合でも常にエンティティ化されます。

FOR XML では、必要な場合のみ hex(27) と hex(22) がエンティティ化されます。次に示す状況ではエンティティ化されません。

  • 属性コンテンツでは、属性値が " で区切られる場合、hex(27) (' 文字) はエンティティ化されません。属性値が ' で区切られる場合、hex(22) (" 文字) はエンティティ化されません。
  • 要素コンテンツでは、hex(27) と hex(22) は一切エンティティ化されません。

FOR XML では、タイムスタンプ値が整数にマップされます。

FOR XML では、タイムスタンプ値はバイナリ値にマップされます。

詳細については、「timestamp データ型に対する FOR XML サポート」を参照してください。

高 (timestamp 列を使用する場合)、それ以外は低

FOR XML と OPENXML では、名前で使用される上位の Unicode 文字 (3 バイト) は 8 ビットで表されます。

たとえば、8 つの位置を使用して、FOR XML は Unicode コード ポイント U+10000 を次のように表します。

<a_x00010000_ c1="1" />

FOR XML と OPENXML では、名前で使用される上位の Unicode 文字 (3 バイト) は 6 つの位置を使用して表します。

たとえば、6 つの位置を使用して、FOR XML は Unicode コード ポイント U+10000 を次のように表します。

<a_x010000_ c1="1" />

FOR XML では、AUTO モードでの派生テーブル マッピングは透過的に扱われます。

例 :

USE AdventureWorks
CREATE TABLE Test(id int);
INSERT INTO Test VALUES(1);
INSERT INTO Test VALUES(2);
SELECT * FROM (SELECT a.id AS a, 
b.id AS b FROM Test a 
JOIN Test b ON a.id=b.id) 
Test FOR XML AUTO;

AdventureWorks の互換性レベルが 80 に設定されている場合、上記の例は次のようになります。

<a a="1"><b b="1"/></a>

<a a="2"><b b="2"/></a>

FOR XML では、AUTO モードでの派生テーブル マッピングは不透過として扱われます。

AdventureWorks の互換性レベルを 90 に設定した場合、左記の例では次の結果が返されます。

<Test a="1" b="1"/>

<Test a="2" b="2"/>

AUTO モードの変更に関する詳細については、「AUTO モードの機能強化」を参照してください。

高 (FOR XML AUTO モードがビューに適用される場合)、それ以外は低

文字列から money への変換では、日本語と韓国語でのみ、通貨記号としての円記号 (\) の使用がサポートされます。

すべての言語において、あらゆる文字列を money へ変換する場合にバックスラッシュ文字を使用できます。\ が通貨記号として使用されている場合、ISNUMERIC では true が返されます。

SQL Server 2005 より前のバージョンの SQL Server データベースでは、日本語と韓国語以外の言語の場合、バックスラッシュ文字を含む ISNUMERIC の戻り値に依存するインデックスと計算列は、この新しい動作によって分割されます。

オペランドで NULL 値が許容されず、ANSI_WARNINGS または ARITHABORT が ON に設定されている場合でも、算術演算子の結果では、常に NULL 値が許容されます。

ANSI_WARNINGS または ARITHABORT が ON に設定されているときは、両方のオペランドが NULL 値非許容の場合に浮動小数点算術演算子の結果が NULL 値を許容しません。

NULL 値許容がこのように変更されたため、SQL Server 2000 テーブルのバイナリ形式を使用するデータと一緒に浮動小数点算術演算子を使用する計算列を、bcp を使用して一括エクスポートし、bcp または BULK INSERT を使用してそのデータを同じ定義の SQL Server 2005 テーブルに一括インポートすると、エラーが発生する可能性があります。

ms178653.note(ja-jp,SQL.90).gifメモ :

両方のオプションを OFF にした場合、結果はデータベース エンジンによって NULL 値を許容するものとしてマークされます。これは SQL Server 2000 と同じ動作です。

nvarchar をパラメータとして使用する組み込み関数では、渡された値が varchar の場合、値は nvarchar(4,000) に変換されます。SQL Server 2000 では、より大きい値が渡されると、その値は暗黙に切り捨てられます。

nvarchar をパラメータとしてとる組み込み関数に対しては、指定された値が varchar である場合、値はやはり nvarchar (4,000) に変換されます。ただし、より大きい値が渡されると、SQL Server 2005 ではエラーが発生します。

互換性レベル 90 で実行するには、切り捨ての動作によって影響を受けるカスタム コードを修正する必要があります。

固定長 (charbinary、または nchar) の文字列と可変長 (varcharvarbinarynvarchar) の文字列を結合すると、固定長の結果が返されます。

可変サイズ文字列と固定サイズ文字列を結合すると、可変サイズ文字列が返されます。

互換性レベル 90 で実行するには、可変長型と固定長型の結合結果のデータ型に影響を受ける部分 (インデックス、クエリ、計算列) をすべて修正する必要があります。

文字 0xFFFF を含むオブジェクト名は、有効な識別子です。

文字 0xFFFF を含むオブジェクト名は無効な識別子であり、アクセスできません。

互換性レベル 90 で実行するには、この文字を含むオブジェクト名を変更する必要があります。

SELECT ISNUMERIC('<string>') の <string> に記述されるコンマは重要な意味があります。

たとえば、SELECT ISNUMERIC('121212,12') という次のクエリは 0 を返します。これは、文字列 121212,12 が数字ではないことを示します。

SELECT ISNUMERIC('<string>') の <string> に記述されるコンマは無視されます。

たとえば、SELECT ISNUMERIC('121212,12') という次のクエリは 1 を返します。これは、文字列 121212,12 が数字であることを示します。

Transact-SQL ステートメントの予約されたキーワードの後にコロン (:) がある場合、このコロンは無視されます。

Transact-SQL ステートメント内の予約キーワードに続くコロン (:) は、ステートメントが失敗する原因になります。

外部クエリからの列を参照するサブクエリの GROUP BY 句は正常に処理されます。

外部クエリからの列を参照するサブクエリの GROUP BY 句は、SQL 標準に従いエラーを返します。

予約済みキーワード

互換性設定では、データベース エンジンで予約されているキーワードも判別されます。次の表は、各互換性レベルで使用される予約済みキーワードです。

互換性レベルの設定 予約済みキーワード

90

EXTERNAL、PIVOT、UNPIVOT、REVERT、TABLESAMPLE

80

COLLATE、FUNCTION、OPENXML

70

BACKUP、CONTAINS、CONTAINSTABLE、DENY、FREETEXT、FREETEXTTABLE、PERCENT、RESTORE、ROWGUIDCOL、TOP

65

AUTHORIZATION、CASCADE、CROSS、DISTRIBUTED、ESCAPE、FULL、INNER、JOIN、LEFT、OUTER、PRIVILEGES、RESTRICT、RIGHT、SCHEMA、WORK

各互換性レベルの予約済みキーワードには、そのレベル以下で導入されるキーワードもすべて含まれています。したがって、たとえばレベル 90 のアプリケーションの場合、上の表に一覧表示されているすべてのキーワードが予約されています。それより下位の互換性レベルでは、レベル 90 のキーワードは有効なオブジェクト名ですが、そのキーワードに対応するレベル 90 の言語機能は使用できません。

キーワードはいったん導入されると、キーワードの予約が維持されます。たとえば、互換性レベル 70 で導入された予約済みキーワード BACKUP は、レベル 80 と 90 でも予約済みとして扱われます。

互換性レベル設定でキーワードとして予約した識別子をアプリケーションで使用しようとすると、アプリケーションは失敗します。この問題を回避するには、識別子をかっこ ([]) または引用符 ("") で囲みます。たとえば、識別子 EXTERNAL を使用しているアプリケーションを互換性レベル 90 にアップグレードするには、識別子を [EXTERNAL] または "EXTERNAL" のように変更します。

権限

このプロシージャを実行できるのは、データベース所有者、sysadmin 固定サーバー ロールのメンバ、および db_owner 固定データベース ロールのメンバ (現在のデータベースを変更する場合) だけです。

A. 互換性レベルを SQL Server 2000 に変更する

次の例では、AdventureWorks データベースの互換性レベルを 80 に変更します。

EXEC sp_dbcmptlevel AdventureWorks, 80;
GO

B. ORDER BY での互換性レベルの影響 (シナリオ 1)

次の例は、互換性レベル 80 と 90 の ORDER BY バインドの違いを示しています。この例では、サンプル テーブル SampleTabletempdb データベース内に作成します。

USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO

互換性レベル 90 (既定) の場合、次の SELECT... ORDER BY ステートメントを実行すると、AS 句の列名 c1 があいまいなためエラーが発生します。

SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

データベースを互換性レベル 80 に再設定した後で、同じ SELECT... ORDER BY ステートメントを実行すると、ステートメントは成功します。

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1
    FROM SampleTable
    ORDER BY c1;
GO

次の SELECT... ORDER BY ステートメントは、どちらの互換性レベルでも機能します。

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

sp_dbcmptlevel tempdb, 90
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

C. ORDER BY での互換性レベルの影響 (シナリオ 2)

互換性レベル 90 (既定) の場合、次の SELECT...ORDER BY ステートメントを実行すると、ORDER BY 句にテーブルのプレフィックスがあるためエラーが発生します。

SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

データベースを互換性レベル 80 に再設定した後で、同じ SELECT...ORDER BY ステートメントを実行すると、ステートメントは成功します。

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY SampleTable.x;
GO

次の SELECT...ORDER BY ステートメントは、どちらの互換性レベルでも機能します。

sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1 AS x
    FROM SampleTable
    ORDER BY x;
GO

参照

関連項目

データベース エンジンのストアド プロシージャ (Transact-SQL)
ALTER DATABASE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
EXECUTE (Transact-SQL)
予約済みキーワード (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
システム ストアド プロシージャ (Transact-SQL)
UPDATE (Transact-SQL)

その他の技術情報

データベース互換性レベル オプション
FOR XML の新機能
データベース オプションの設定
SQL Server でのオプションの使用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 7 月 17 日

変更内容 :
  • master データベースの互換性レベルは変更できないという記述を削除しました。

2006 年 4 月 14 日

追加内容 :
  • 「推奨事項」のセクションを追加。
  • サブクエリの GROUP BY の動作に関する説明を追加。