當我們編寫我們的CRUD存儲過程時,我們添加一個擴展屬性來指示它們所基於的表。我希望能夠詢問sys.extended_properties
以獲取依賴於給定表格的特效列表,但extended_properties
包含的major_id與sys.objects
或sys.sysobjects
中的object_id不相同。如何將sys.extended_properties中的標識映射到對象名稱
我需要什麼魔術連接?
當我們編寫我們的CRUD存儲過程時,我們添加一個擴展屬性來指示它們所基於的表。我希望能夠詢問sys.extended_properties
以獲取依賴於給定表格的特效列表,但extended_properties
包含的major_id與sys.objects
或sys.sysobjects
中的object_id不相同。如何將sys.extended_properties中的標識映射到對象名稱
我需要什麼魔術連接?
從sys.extended_properties的books online條目中,major_id = object_id如果class = 1,2或7.如果運行手動查詢,這個屬性的類是什麼?我的猜測是,下面的工作:
select object_name([major_id]), [name], [value]
from sys.extended_properties
從MSDN,您必須檢查class
字段以及major_id
。
如果類是0,major_id始終爲0。
如果等級爲1,2或7 major_id是 的object_id。
其他類似乎是無證的,因此我不會依賴它們。例如,類5似乎用於CLR程序集(SqlAssemblyProjectRoot)。在我的情況下,一個這樣的程序集的major_id
是65673,並且該ID的sys.objects
中甚至沒有不匹配的對象。 (1)對象(例如表,存儲過程)或列,(2)參數,(7)索引對應於(1)對象(例如表,存儲過程)或對應的記錄的1,2,7。在你的情況下,它應該涵蓋你要找的東西。
sys.extended_properties的MSDN描述major_id和minor_id。 上下文取決於類列。
現在,major_id = object_id在sys.objects當它是有道理的。
我以前用過這個測試擴展屬性,所以我知道它的工作原理。
但是,在您的問題的二讀中,存儲過程的擴展屬性與proc中使用的表之間沒有直接關聯。如果我理解正確,您必須通過sys.sql_expression_dependencies進行連接
是'sys.sql_expression_dependencies'可靠嗎? IIRC,即使解析器無法確定所有依賴對象,也可以使用「CREATE」或「ALTER」存儲過程。在這種情況下,他們不會從DMV中錯過嗎? – Yuck 2011-05-10 16:48:33
@Yuck:我不確定我的頭頂。它取代了舊的不可靠的系統表,但我不記得這個是多麼準確,對不起。編輯:是的,這是更好的http://sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/keeping-sysdepends-up-to-date-in-sql-server-2008.aspx – gbn 2011-05-10 16:53:44
不能直接回答你的問題,但一些額外的資源:
我有一個關於使用內置的擴展屬性的東西像文檔演示:http://code.google.com/p/caderoux/wiki/LeversAndTurtles
同時也出現了最近一系列的亞當·阿斯平在擴展性能的製品的SQLserver中央公佈:
http://www.sqlservercentral.com/articles/Metadata/72607/
http://www.sqlservercentral.com/articles/Metadata/72608/
是的 - 它確實工作 – Rikalous 2011-05-12 09:33:46