在这个问题上 -我正在使用sys.sysobjects编写一个查询。然而,其中一个答案提到了sys.system_objects。我只是想知道这些桌子有什么区别?
sys.objectssys.system_objectssys.sysobjectssysobjects还有更多的东西。
> SELECT count(*) FROM sysobjects;
2312
> SELECT count(*) FROM sys.system_objects;
2201
> SELECT count(*) FROM sys.objects;
> 111
SELECT count(*)
FROM sys.sysobjects
WHERE NOT EXISTS (
SELECT 1
FROM sys.system_objects
WHERE system_objects.object_id = sysobjects.id
);
> 111发布于 2017-12-19 10:53:04
正如我在上一篇文章中所指出的,sys.sysobjects是不可取的:
注意:从sys.sysobjects (Transact-SQL)中获取的这个Server 2000系统表是作为向后兼容性视图而包含的。建议您改用当前的Server系统视图。若要查找等效的系统视图,请参阅将系统表映射到系统视图(Transact-SQL)。此功能将在Microsoft Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
现在您必须将sys.system_objects和sys.objects组合起来,以检索存储在不推荐的sys.sysobjects系统表中的所有项。
SELECT * FROM sys.system_objects
UNION ALL
SELECT * FROM sys.objects AS o结果:
(2171 row(s) affected)sys.system_objects包含Microsoft中包含的所有架构作用域系统对象的一行。所有系统对象都包含在名为sys或INFORMATION_SCHEMA的架构中。sys.objects包含在数据库中创建的每个用户定义的模式作用域对象的行,包括本机编译的标量用户定义函数。例如,sp_MScleanupmergepublisher是ìs_ms_shipped,但不在sys模式中(在dbo中),所以它在sys.objects中而不是sys.system_objects中。这可能是因为它是sys.sp_MScleanupmergepublisher_internal的外壳,并且可能是在创建实例时定义的。如果您有SSMS,右键单击dbo.sp_MScleanupmergepublisher系统存储过程,然后选择Modify:
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_MScleanupmergepublisher] Script Date: 19.12.2017 12:12:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER procedure [dbo].[sp_MScleanupmergepublisher]
as
exec sys.sp_MScleanupmergepublisher_internal发布于 2017-12-19 11:26:38
不同之处在于:
sys.sysobjects是一个旧的Server 2000系统表(兼容性视图)。从Server 2005开始,Microsoft引入了一组称为目录视图的新视图,作为兼容性视图的替代。为了实现向后兼容性,兼容视图仍在Server中(Microsoft决定保留旧视图以避免破坏某些内部代码)。sys.system_objects是一个目录视图。您可以通过执行以下命令来检查对象定义:SELECT OBJECT_DEFINITION(OBJECT_ID('sys.system_objects'))在目录视图中,您可以看到它们使用的是系统表sys.sysschobjs:
CREATE VIEW sys.system_objects
AS
SELECT o.name,
o.id AS object_id,
convert(int, null) AS principal_id,
o.nsid AS schema_id, convert(int, 0) AS parent_object_id,
o.type,
n.name AS type_desc,
o.created AS create_date,
o.modified AS modify_date,
convert(bit, 1) AS is_ms_shipped,
convert(bit, 0) AS is_published,
convert(bit, 0) AS is_schema_published
FROM sys.sysschobjs o
LEFT JOIN sys.syspalnames n ON n.class = 'OBTY' AND n.value = o.type WHERE has_access('SO', o.id) = 1 从sys.objects中提取,您可以找到sys.sysschobjs
SELECT name, type_desc FROM sys.objects
WHERE name = 'sysschobjs' +------------+--------------+
| name | type_desc |
+------------+--------------+
| sysschobjs | SYSTEM_TABLE |
+------------+--------------+您可以通过执行以下命令找到目录视图:
SELECT *
FROM sys.all_views
WHERE [schema_id] = 4 AND [name] NOT LIKE 'dm%' AND [object_id] NOT IN (-212,-211,-210,-209,-208,-207,-206,-205,-204,-203,-202,-201,-200,-199,-198,-197,-196,-195,-194,-193,-192,-143,-142,-141,-140,-139,-138,-137,-136,-135,-134,-133,-132,-131,-130,-129,-106,-105)
ORDER BY [name] ASC您可以查看其他系统表并进行以下比较:
sys.databases ( Server 2005及以上)sys.sysdatabases ( Server 2000)微软不鼓励我们使用旧的系统表。旧的兼容性视图没有与Server功能的更高版本相关的新元数据(例如。分区等)只在Server 2000上使用它,因为Microsoft将从Server的未来版本中删除它。
https://dba.stackexchange.com/questions/193505
复制相似问题