首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 相容模式 80 仍可使用 DMV:參數化呼叫與跨資料庫查詢技巧

     編輯:關於SqlServer

迷思

資料庫設為 SQL Server 2000 相容模式(80)後,無法使用 DMV/DMF。

事實

相容模式僅影響 T-SQL 語法解析、查詢計劃行為等,不影響系統物件(DMV/DMF)的可用性。資料庫內部版本號會隨升級而改變,與相容模式無關。

為何會以為不能用?

在相容模式 80 下,無法在 DMV 參數中直接呼叫函數(如 DB_ID('dbname')、OBJECT_ID('table')),會報語法錯誤。但 DMV 本身支援。

兩種解決技巧

技巧一:跨資料庫三段式命名呼叫

-- 在相容模式 90+ 的資料庫(如 master)執行
USE master;
SELECT * FROM sys.dm_db_index_physical_stats(
    DB_ID('DMVTest'),           -- database_id
    OBJECT_ID('DMVTest..t1'),   -- object_id:三段式命名關鍵!
    NULL, NULL, 'DETAILED');

注意:OBJECT_ID 必須使用三段式(DB..table),否則會在當前資料庫尋找物件導致錯誤。

技巧二:先存入變數再傳入

DECLARE @dbid INT = DB_ID('DMVTest');
DECLARE @objid INT = OBJECT_ID('t1'); -- 在相容模式 80 資料庫內執行此行
SELECT * FROM sys.dm_db_index_physical_stats(@dbid, @objid, NULL, NULL, 'DETAILED');

補充提醒

  • sys.dm_db_index_physical_stats 技術上是 DMF(動態管理函數),傳 NULL 會掃描所有索引,成本極高,生產環境慎用。
  • 相容模式不影響資料庫實際版本,附加/還原時版本檢查依內部版本號,非相容模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved