SQL Server中Information_schema与sys表之间的区别

时间:2017-09-13 02:08:35

标签: sql sql-server

SQL Server中的information_schema表和sys表是什么?它们之间有什么区别?

2 个答案:

答案 0 :(得分:13)

INFORMATION_SCHEMAsys对象都是SQL Server中可用的元数据目录。

INFORMATION_SCHEMA set of views是元数据的ANSI / ISO标准目录。大多数RDBMS支持大多数INFORMATION_SCHEMA视图,并且无论供应商如何,每个视图都公开基本相同的信息。在SQL Server中,大多数(如果不是全部)INFORMATION_SCHEMA视图都是以某种方式返回sys表的视图。在SQL Server中,您可以通过运行以下查询来查看基础VIEW定义:

SELECT OBJECT_DEFINITION(OBJECT_ID('INFORMATION_SCHEMA.TABLES'))    

返回:

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是Sybase创建的原始元数据目录视图和表AFAIK(Microsoft从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在该文章中的偏见有点过分夸张,但他可能比我更多地被这个问题所困扰,他也可能在比我更复杂的数据库上工作。)< / p> 然而,那说:

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视图组织得更好,更容易使用即席查询按名称或列名查找表格,但有一些极端情况需要转到{ {1}}对象表,在某些情况下,sys视图中缺少的对象会咬你。如果我正在寻找一套可靠而完整的项目,那么我会使用INFORMATION_SCHEMA表(特别是syssys.objects),但这些需要更多工作才能获得可读结果。 sys.all_objects次观看已为您完成了大量工作。

答案 1 :(得分:0)

INFORMATION_SCHEMA.TABLES 视图允许您获取有关数据库中所有表和视图的信息。默认情况下,它会显示数据库中每个表和视图的此信息。

请访问:https://www.mssqltips.com/sqlservertutorial/196/informationschematables/

系统表格包含最重要的元数据,即有关您数据的数据。此数据包括有关表名,列名和数据类型的信息,以便SQL Server可以正确处理查询并返回结果集。系统表包含有关有效用户及其权限的信息,因此数据可以是安全的,以及有关SQL Server配置的信息,因此您可以预测和控制系统的行为。