SQL Serverエラーは30日に話しました。13日目はSQL Server 2000互換モードでDMVは使えません。


エラーエリア鏣13.SQL Server 2000互換モードではDMVは使用できません。
エラー 
     互換モードには多くの誤解があります。80の互換モードのデータベースはSQL Server 2000データベースに追加または復元できるということですか?もちろんです。これはT-SQLの文法を意味するだけでなく、クエリプログラムの動作および他のいくつかの態様はSQL Server 2000の動作と同じである(もちろん、90互換モードに設定されているならSQL Server 2005と同じ)。
    SQL Server 2008では、ALTER DATABASE SET COMPATIBILITY_を使用できます。LEVELコマンドは互換モードを変更し、SQL Server 2008以前のバージョンに対してはシステム格納プロセスsp_を使用する。dbcmpleveldbcmplevel@dbname='AdvidentureWorks',@new_cmputlevel=100)は、この2つの方法についてどう使いますか?
  •     SQL Server 2008に対して、BOL入口ALTER DATABASE Comptibility Level
  •     SQL Server 2005については、BOL入り口スペスdbcmplevel(Transact-SQL).
  •     互換モードはデータベースの実際のバージョンには影響がありません。データベースの実際のバージョンはデータベースのアップグレードによってアップグレードされます。このアップグレードは更新されたバージョンのデータベースの回復を阻止します。または以前のバージョンのインスタンスは新版のデータベースのバージョンを理解できません。詳細を見たいなら、私のブログを見てください。Search Engine Q&A芰13:Difference between database version and database comptibility level.また新版のデータベースを旧版のインスタンスに添付すると、エラーメッセージが発生します。Msg 602、Level 21、State 50、Line 1
        SQL Server 2005では80互換モードに設定されていますが、DMVは使えないようです。次のコードを実行してテストデータベースを作成します。
    CREATE DATABASE DMVTest;GO USE DMVTestGO CREATE TABLE t 1(c 1 INT);CREATE CLUSTERED INDEX 1 c 1 on t 1(c 1);INSERT INTO t 1 VALLES(1);GO。
    EXEC sp_dbcmplevel DMVTest、80;GO。
    SELECT*FROM sys.dm_db_index_physicalstats(DB_ID(''DMVTest')--database ID OBJECT_ID('t 1')--object ID<<    次のようなエラーメッセージがあります。
    メッセージ102、レベル15、状態1、第3行'('の近くに文法エラーがあります。
        これは80互換モードがDMVをサポートしていないことを証明しているように見える。でも、実はそうではないです。
        ここに書いてから、私は突然パラドックスに陥ったことに気づきました。DMVは80互換モードでは完全にサポートされていますが、サポートされていないのは80互換モードでDMVのパラメータとして関数を呼び出します。
        以下は80互換モードでDMVパラメータとして関数を使用できるテクニックです。それは90以上の互換モードのデータベースで80互換モードのデータベースを追加的に呼び出し、次のコードを参照してください。
    USEマスターSELECT*FROM sys.dm_db_index_physicalスター  DB_ID(''DMVTest')         -- database ID  OBJECT_ID(''DMVTest.t 1')--object ID   <<<<<< Note I'm using 3-partnaming here now  NULL                      -- index ID  NULL                      -- パーティーID  'DETAILE;               -- scan mode GO 
        DMVTestデータベースは80互換モードで動作しているが、上述のコードは依然として利用可能である。
        しかし、注意すべき点は、Objectパラメータの正確さを保証してください。2番目のパラメータだけをOBJECT(u)にしてもいいです。ID('t 1')を使用すると、この関数はマスターデータベースからテーブルt 1を探してみます。正常にはNULLに戻ります。これは先ほどのDMVがNULLをパラメータとして、DMVTestテーブルのインデックス状態に戻ります。MasterテーブルにDMVがあると、より不幸になります。エラーの情報を得ることになります。
        また、sys.dm_db_index_physicalスターtsは本物のDMVではなく、バックグラウンドで大量の情報を処理して、関連情報のDMFに戻るので、NULLをパラメータとしてインデックス情報をすべて返すと、その価格は非常に高くなります。最近のブログInside sys.dm_db_index_physicalstatsをご覧ください。この章は詳細と価格を詳しく説明します。
        もう一つは80互換モードでDMVを使用する方法であり、DMVでは関数をパラメータとしなくて、変数を送る方法である。コードは以下の通りである。
    DECLARE@databaseID INT;DECLARE@object ID INT;
    SELECT@databaseID=DB_ID(''DMVTest')SELECT@object ID=OBJECT_ID('t 1')
    SELECT*FROM sys.dm_db_index_physicalstats(@dbid,--database ID@objid,--object ID NULL,--index ID NULL,--partition ID'DETAILE'),--scan mode GO
        うん、また一つの落とし穴を掲示しました。