2011-06-29 126 views
2

我注意到,当我查询dbo.sysobjects时,为了确定我数据库中的所有对象,它还会选取名称以'syncobj_'开头的所有系统视图。它们的xtype为'V',似乎没有任何方式可以知道这些是系统视图,除了检查视图的名称外,并不是我自己的。有没有其他的方法?我想从我正在创建的查询中排除这些。SQL Server - 查询sysobjects

+1

你可能想看看这个SO Q/A:您正在使用什么版本的SQL Server http://stackoverflow.com/questions/2910077/what-is-syncobj-in-sql-server – bzarah

+0

?这可能会影响您获得的回复的有效性或质量。例如,如果您在2005+以上,那么比sysobjects有更好的答案。建议使用确切(或最小)版本标记标签(例如标签“sql-server-2008”)。 –

+0

@Aaron - 如果我需要数据库中所有对象的完整列表,那么比sysobjects有什么更好的选择?我知道我可以使用信息模式视图,但是我需要查询其中的十几个。使用2008. –

回答

2

OBJECTPROPERTY

IsMSShipped

SQL Server安装过程中创建的任何架构范围内的对象

对象。 1 =真0 =假

使用它是这样的:

SELECT * from sysobjects where OBJECTPROPERTY(ID,N'IsMSShipped') = 0 

它的文档是有点过,但 - 它也帮助你排除其他对象增加了“通过”的SQL Server在以后的日子也 - 例如任何复制相关的对象也被认为是IsMSShipped

0

试着这么做:

select * 
from sysobjects 
where name NOT IN (
    select name from sys.system_views 
) 
+1

实际上可能更好地使用object_id。 'select * from sysobjects 其中id NOT IN( \t从sys.system_views中选择object_id )' –

+0

记得加入你的表。 select * from sysobjects where id NOT IN(从sys.system_views中选择object_id,其中sysobjects.id = object_id)或更好,则存在使用。 –

+0

这仍然允许系统表和其他对象通过。 –

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; 
+0

请注意,这仍然会返回一些系统对象,例如dtproperties表(在添加图表支持到数据库时添加)不被视为MS发布,而是用户表。 –