2017-09-13 99 views
2

SQL Server中的information_schema表和sys表是什麼?他們之間有什麼不同?SQL Server中的information_schema vs sys表之間的區別

謝謝

+0

'information_schema' * views *提供了一個相當標準化的元數據接口。 「sys」表/視圖特定於SQL Server,幷包含更多專有(和完整)信息。我更喜歡前者的基本信息。 –

+1

[SQL Server在目錄視圖,信息模式視圖與DMV之間的區別]的可能重複(https://stackoverflow.com/questions/4195064/sql-server-difference-between-catalog-views-information-schema-views-vs -dmvs) –

+0

@DanGuzman對你沒有任何意義,但那個鏈接的答案是*糟糕的*。 –

回答

2

兩個INFORMATION_SCHEMAsys對象都是元數據目錄是在SQL Server中可用。

INFORMATION_SCHEMA set of views是元數據的ANSI/ISO標準目錄。大多數RDBMS支持大多數INFORMATION_SCHEMA視圖,並且無論供應商如何,每個視圖都公開基本相同的信息。在SQL Server中,大多數(即使不是全部)INFORMATION_SCHEMA視圖都是以某種方式返回到sys表的視圖。

​​

它返回:

CREATE VIEW INFORMATION_SCHEMA.TABLES 
AS 
SELECT 
    DB_NAME()   AS TABLE_CATALOG, 
    s.name    AS TABLE_SCHEMA, 
    o.name    AS TABLE_NAME, 
    CASE o.type 
     WHEN 'U' THEN 'BASE TABLE' 
     WHEN 'V' THEN 'VIEW' 
    END    AS TABLE_TYPE 
FROM 
    sys.objects o LEFT JOIN sys.schemas s 
    ON s.schema_id = o.schema_id 
WHERE 
    o.type IN ('U', 'V') 

sys tables and views是原來的元數據目錄視圖和表格是,據我所知,通過建立在SQL Server中,您可以通過運行查詢,如見下面的視圖定義Sybase(Microsoft購買SQL Server原始代碼庫的供應商)。大多數RDBMS具有一組等效的目錄表,但特定的表名在供應商之間各不相同。在SQL Server中,這些表以及後來添加的動態管理視圖(DMV)是Microsoft爲捕獲系統和用戶使用的數據庫元數據而創建的。

在SQL Server中,由於INFORMATION_SCHEMA視圖通常指向sys表,並且由於這些視圖的ISO定義,因此the INFORMATION_SCHEMA views to not contain all metadata or all objects that you're looking for並不少見。 (就我個人而言,我認爲Aaron在那篇文章中的偏見有點過分,但他可能被這個問題困擾得比我更多,他也可能在比我更復雜的配置數據庫上工作。)

然而,

SELECT OBJECT_DEFINITION(OBJECT_ID('sys.tables')) 

返回:

CREATE VIEW sys.tables AS 
    SELECT o.name, o.object_id, o.principal_id, o.schema_id, o.parent_object_id, 
     o.type, o.type_desc, o.create_date, o.modify_date, 
     o.is_ms_shipped, o.is_published, o.is_schema_published, 
     isnull(ds.indepid, 0) AS lob_data_space_id, 
     rfs.indepid AS filestream_data_space_id, 
     o.property AS max_column_id_used, 
     o.lock_on_bulk_load, o.uses_ansi_nulls, o.is_replicated, o.has_replication_filter, 
     o.is_merge_published, o.is_sync_tran_subscribed, o.has_unchecked_assembly_data, 
     lob.intprop AS text_in_row_limit, 
     o.large_value_types_out_of_row, 
     o.is_tracked_by_cdc, 
     o.lock_escalation_option AS lock_escalation, 
     ts.name AS lock_escalation_desc, 
     o.is_filetable, 
     o.is_memory_optimized, 
     o.durability_option as durability, 
     d.name as durability_desc 
    FROM sys.objects$ o 
    LEFT JOIN sys.sysidxstats lob ON lob.id = o.object_id AND lob.indid <= 1 
    LEFT JOIN sys.syssingleobjrefs ds ON ds.depid = o.object_id AND ds.class = 8 AND ds.depsubid <= 1 -- SRC_INDEXTOLOBDS 
    LEFT JOIN sys.syssingleobjrefs rfs ON rfs.depid = o.object_id AND rfs.class = 42 AND rfs.depsubid = 0 -- SRC_OBJTOFSDS 
    LEFT JOIN sys.syspalvalues ts ON ts.class = 'LEOP' AND ts.value = o.lock_escalation_option 
    LEFT JOIN sys.syspalvalues d ON d.class = 'DOPT' AND d.value = o.durability_option 
    WHERE o.type = 'U' 

這顯然是回到了很多更詳細的信息,並注意INFORMATION_SCHEMA.TABLES同時返回用戶表和視圖,而sys.tables只返回用戶表。

就個人而言,我覺得INFORMATION_SCHEMA意見更好組織和更容易使用的即席查詢按名稱查找表或列的名字,但也有,你必須去sys對象表的一些極端情況和在某些情況下,INFORMATION_SCHEMA視圖中的缺失對象可能會咬你。如果我正在尋找一組可靠和完整的物品,那麼我使用sys表格(特別是sys.objectssys.all_objects),但那些需要更多工作才能獲得可讀結果。 INFORMATION_SCHEMA的觀點已經爲你做了很多工作。

0

INFORMATION_SCHEMA.TABLES視圖允許您獲取有關數據庫中所有表和視圖的信息。默認情況下,它會顯示數據庫中每個表和視圖的這些信息。

請訪問本:包含所有重要的元數據https://www.mssqltips.com/sqlservertutorial/196/informationschematables/

Sys系統表中的數據有關的數據。此數據包含有關表名,列名和數據類型的信息,以便SQL Server可以正確處理查詢並返回結果集。系統表包含有關有效用戶及其權限的信息,因此可以保護數據的安全以及有關SQL Server配置的信息,以便預測和控制系統的行爲。

相關問題