SQL Server中的information_schema表和sys表是什么?它们之间有什么区别?
答案 0 :(得分:13)
INFORMATION_SCHEMA
和sys
对象都是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
表(特别是sys
或sys.objects
),但这些需要更多工作才能获得可读结果。 sys.all_objects
次观看已为您完成了大量工作。
答案 1 :(得分:0)
INFORMATION_SCHEMA.TABLES 视图允许您获取有关数据库中所有表和视图的信息。默认情况下,它会显示数据库中每个表和视图的此信息。
请访问:https://www.mssqltips.com/sqlservertutorial/196/informationschematables/
系统表格包含最重要的元数据,即有关您数据的数据。此数据包括有关表名,列名和数据类型的信息,以便SQL Server可以正确处理查询并返回结果集。系统表包含有关有效用户及其权限的信息,因此数据可以是安全的,以及有关SQL Server配置的信息,因此您可以预测和控制系统的行为。