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

jss*_*e89 14 sql sql-server

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

谢谢

Bac*_*its 15

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

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

SELECT OBJECT_DEFINITION(OBJECT_ID('INFORMATION_SCHEMA.TABLES'))    
Run Code Online (Sandbox Code Playgroud)

哪个回报:

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')
Run Code Online (Sandbox Code Playgroud)

sys表和视图是是,据我所知原来的元数据目录视图和表,由Sybase(微软购买了从SQL Server的原代码库的供应商)创建的.大多数RDBMS都有一组等效的目录表,但特定的表名在供应商之间是不同的.在SQL Server中,这些表以及稍后添加的动态管理视图(DMV)是Microsoft为捕获系统和用户使用的数据库元数据而创建的.

在SQL Server,因为该INFORMATION_SCHEMA视图通常指回sys表,由于这些意见ISO的定义,它是并不少见INFORMATION_SCHEMA意见,不包含所有元数据或你正在寻找的所有对象.(就我个人而言,我认为Aaron在那篇文章中的偏见有点夸大其词,但他可能比我更多地被这个问题所困扰,而且他也可能比我更复杂地配置数据库.)

然而,那说:

SELECT OBJECT_DEFINITION(OBJECT_ID('sys.tables'))
Run Code Online (Sandbox Code Playgroud)

返回:

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'
Run Code Online (Sandbox Code Playgroud)

这显然返回了更多详细信息,并注意INFORMATION_SCHEMA.TABLES返回用户表和视图,而sys.tables只返回用户表.

就个人而言,我发现INFORMATION_SCHEMA视图组织得更好,更容易用于临时查询按名称或列名查找表,但是有一些极端情况需要转到sys对象表,有些情况会丢失INFORMATION_SCHEMA视图中的对象可以咬你.如果我正在寻找一套可靠而完整的项目,那么我会使用这些sys表格(特别是sys.objects或者sys.all_objects),但这些需要更多的工作来获得可读的结果.这些INFORMATION_SCHEMA观点已经为你做了很多工作.