查詢 SQL Server 系統目錄
不是以硬式編碼來操作一組特定資料表和檢視的動態應用程式,必須能夠判斷所連接資料庫物件的結構與屬性。這些應用程式可能需要的資訊如下:
資料庫中資料表與檢視的代碼和名稱。
資料表或檢視中的資料行數目,並包含每個資料行的名稱、資料類型、小數位數和有效位數。
資料表中定義的條件約束。
為資料表定義的索引和索引鍵。
系統目錄會針對 SQL Server 資料庫提供此資訊。SQL Server 系統目錄的核心是一組檢視,可顯示中繼資料來說明 SQL Server 執行個體中的物件。中繼資料是用來描述系統中之物件屬性的資料。SQL Server 型的應用程式可利用下列管道來存取系統目錄中的資訊:
目錄檢視。建議採用此存取方法。
資訊結構描述檢視。
OLE DB 結構描述資料列集。
ODBC 目錄函數。
系統預存程序和函數。
目錄檢視
目錄檢視會提供您存取權,讓您存取儲存在伺服器中每一個資料庫的中繼資料。
[!附註]
目錄檢視不提供對複寫、SQL Server Agent 或備份中繼資料的存取權。
建議您使用目錄檢視來存取中繼資料,原因如下:
所有中繼資料都可以用目錄檢視來取得。
無論目錄資料表的實作方法為何,目錄檢視都是以獨立的格式來顯示中繼資料,因此目錄檢視不會因為基礎目錄資料表中的變更而受到影響。
目錄檢視是存取核心伺服器中繼資料最有效率的方法。
目錄檢視是存取目錄中繼資料的一般介面,提供最直接的方式來取得、轉換及顯示此中繼資料的自訂表單。
目錄檢視名稱及其資料行的名稱都是描述性的。使用者只要對所查詢之中繼資料的對應功能有適度的瞭解,查詢結果通常都會與使用者的預期相符。
例如,下列查詢會使用 sys.objects 目錄檢視來傳回過去 10 天內修改過的所有資料庫物件。
SELECT name AS object_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,create_date
,modify_date
FROM sys.objects
WHERE modify_date > GETDATE() - 10
ORDER BY modify_date;
如需有關使用目錄檢視來查詢系統目錄的其他範例,請參閱<查詢 SQL Server 系統目錄 FAQ>。
重要事項 |
---|
在 SQL Server 的未來版本中,Microsoft 可能會在資料行清單結尾加入資料行,擴充任何系統目錄檢視的定義。建議不要在實際執行的程式碼中使用 SELECT * FROM sys.catalog_view_name,因為傳回的資料行數可能會變更和破壞應用程式。 |
資訊結構描述檢視
資訊結構描述檢視是以 ISO 標準中的目錄檢視定義為基礎。無論目錄資料表的實作方法為何,資訊結構描述檢視都是以獨立的格式來顯示目錄資訊,因此不會因為基礎目錄資料表中的變更而受到影響。使用這些檢視的應用程式可以在異質性的 ISO 相容資料庫系統之間轉移。如需詳細資訊,請參閱<資訊結構描述檢視表 (Transact-SQL)>。
[!附註]
資訊結構描述檢視沒有包含 SQL Server 2008 特定的中繼資料。
下列範例會查詢 INFORMATION_SCHEMA.COLUMNS 檢視,以傳回 AdventureWorks 資料庫中 Contact 資料表的所有資料行。
SELECT TABLE_NAME, COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';
相容性檢視
舊版 SQL Server 的許多系統資料表,現在都被當成一組檢視來實作。這些檢視就是所謂的相容性檢視,而且僅與舊版本相容。其所顯示的中繼資料與 SQL Server 2000 中所提供的相同。然而,這些檢視不會顯示與 SQL Server 2005 及更新版本中導入之功能相關的任何中繼資料。因此,當您使用新的功能時 (例如 Service Broker 或分割),必須轉為使用目錄檢視。這是個升級為目錄檢視的好理由。另一個升級為目錄檢視的理由,就是儲存使用者識別碼及類型識別碼的相容性檢視資料行,可能會傳回 NULL 或觸發程序算術溢位。這是因為在 SQL Server 2005 及更新版本中,您可以建立超過 32,767 個使用者和資料類型。例如,如果您要建立 32,768 位使用者,然後再執行下列查詢:SELECT * FROM sys.sysusers,則當 ARITHABORT 設定為 ON 時,查詢會因為算術溢位錯誤而失敗。如果 ARITHABORT 的設定為 OFF,uid 資料行就會傳回 NULL。
為了避免這些問題,建議您升級為使用新的目錄檢視,以處理與日俱增的使用者識別碼及類型識別碼。
OLE DB 結構描述資料列集
OLE DB 規格定義 IDBSchemaRowset 介面,公開一組含有目錄資訊的結構描述資料列集。OLE DB 結構描述資料列集是一種標準方法,可顯示由不同 OLE DB 提供者所支援的目錄資訊。資料列集並不會受基礎目錄資料表的結構所影響。如需詳細資訊,請參閱<結構描述資料列集支援 (OLE DB)>。
Microsoft SQL Server Native Client OLE DB 提供者支援 IDBSchemaRowset 的延伸模組,可報告分散式查詢中所使用之連結伺服器的目錄資訊。如需詳細資訊,請參閱<LINKEDSERVERS 資料列集 (OLE DB)>。
ODBC 目錄函數
ODBC 規格定義一組目錄函數,可傳回包含目錄資訊的結果集。這些函數是一種標準方法,可顯示由不同 ODBC 驅動程式所支援的目錄資訊。結果集並不會受基礎目錄資料表的結構所影響。
SQL Server Native Client ODBC 驅動程式支援兩種驅動程式專用的函數,可報告分散式查詢中所使用之連結伺服器的目錄資訊。如需詳細資訊,請參閱<使用目錄函數>。
系統預存程序和函數
Transact-SQL 可定義伺服器系統預存程序,以及會傳回目錄資訊的系統函數。雖然這些預存程序和函數專屬於 SQL Server,但可以讓使用者不受基礎系統目錄資料表的結構所影響。如需詳細資訊,請參閱<中繼資料函數 (Transact-SQL)>和<系統預存程序 (Transact-SQL)>。