Sql-Server-2012

如何從系統表或視圖中獲取列,如 sys.database_files (SQL Server 2012)

  • May 13, 2020

如何編寫查詢以返回例如sys.database_files表的所有列?我看到很多關於使用 information_schema.columns 獲取使用者數據庫/表的表名的建議,但我不知道如何為系統表執行此操作。

我看到 sys.database_files 是主表下的一個視圖。我正在使用 SQL Server 2012。

由於您使用的是 SQL Server 2012,因此最好使用新的 DMF sys.dm_exec_describe_first_result_set。此 dmf 將一個 transact-SQL 語句作為參數,並描述該語句的第一個結果集的元數據。

因此,例如,您想找出列名以及數據類型和精度sys.database_files,只需使用

SELECT 
   name, 
   system_type_name, 
   is_nullable
-- add/remove columns as per your need ....
FROM 
   sys.dm_exec_describe_first_result_set
   (
       N'SELECT * FROM sys.database_files;', NULL, 0
   ) AS f
ORDER BY
   column_ordinal;

以下是結果:

在此處輸入圖像描述

對於 sql 2012 以下的版本:

SELECT object_NAME(c.object_id) AS OBJECT_NAME
   ,c.NAME AS COLUMN_NAME
   ,t.NAME AS DATA_TYPE
   ,c.max_length AS MAX_LENGTH
FROM sys.all_columns c
INNER JOIN sys.types t ON t.system_type_id = c.system_type_id
WHERE object_name(c.object_id) = 'database_files'

優秀的文章由Aaron Bertrand撰寫——SQL Server v.Next (Denali):元數據增強,詳細解釋了這一點。此外,請參閱文章下方部分中的CAVEATS

我看到許多關於使用 information_schema.columns 獲取使用者數據庫/表的表名的建議。

避免使用 INFORMATION_SCHEMA 視圖。值得一讀 Aaron 關於反對 INFORMATION_SCHEMA 意見的文章。

引用自:https://dba.stackexchange.com/questions/53500