我注意到当我查询dbo.sysobjects时,为了确定我的数据库中的所有对象,它还会获取名称以“syncobj_”开头的所有系统视图。它们的xtype为'V',除了通过检查视图的名称之外,我似乎没有任何方式可以知道这些是系统视图,而不是我自己的视图。还有其他方法吗?我想从我正在创建的查询中排除这些。
答案 0 :(得分:2)
请参阅OBJECTPROPERTY
:
IsMSShipped
任何架构范围的对象
在安装SQL Server期间创建的对象。 1 =真0 =假
使用类似:
SELECT * from sysobjects where OBJECTPROPERTY(ID,N'IsMSShipped') = 0
虽然它的文档有点偏离 - 它还可以帮助您排除“以后”SQL Server添加的其他对象 - 例如任何与复制相关的对象也被视为IsMSShipped
。
答案 1 :(得分:0)
尝试类似:
select *
from sysobjects
where name NOT IN (
select name from sys.system_views
)
答案 2 :(得分:0)
由于您使用的是SQL Server 2008,因此没有理由继续使用过时的兼容性视图sysobjects。您应该使用SQL Server 2005中引入的目录视图sys.objects。作为额外的好处,您不需要为每一行调用外部OBJECTPROPERTY()函数,因为它包含一个名为is_ms_shipped的列,它显示了相同的信息。
SELECT OBJECT_SCHEMA_NAME([object_id]), name, type
FROM sys.objects
WHERE is_ms_shipped = 0;