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
うん、また一つの落とし穴を掲示しました。
エラー
互換モードには多くの誤解があります。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 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
うん、また一つの落とし穴を掲示しました。