2011-06-29 127 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發佈,而是用戶表。 –