Sql-Server
OBJECT_ID(…) 函式與加入 sys.tables 和 sys.schemas
在查詢特定表的元數據時,我可以
- 使用該
OBJECT_ID
功能或- 加入相關的系統表(
sys.tables
和sys.schemas
)。例如,這兩個查詢都將返回 table 的所有 DML 觸發器
myTable
:SELECT * FROM sys.triggers AS t WHERE t.parent_id = OBJECT_ID('[dbo].[myTable]', 'U') SELECT * FROM sys.triggers AS tr INNER JOIN sys.tables AS tab ON tr.parent_id = tab.object_id INNER JOIN sys.schemas AS s ON tab.schema_id = s.schema_id WHERE s.name = 'dbo' AND tab.name = 'myTable';
純粹是口味問題,還是有充分的理由偏愛其中一個(如果兩者都能解決您的問題)?
我的初步分析是:
- 選項 1 更短(顯然)。
- 使用選項 2,我無需擔心引用/轉義表/模式名稱(如果它包含特殊字元)。
- 查詢計劃不同(但不太可能產生巨大差異,因為這不是我計劃經常執行的操作)。
我錯過了什麼重要的事情嗎?
從評論轉換:
您真正應該注意的唯一一件事是它對數據庫上下文敏感,如果您要跨數據庫查詢,例如 from to
OBJECT_ID
,您可能還需要提供它。埃里克·達林master``any_user_database
我記得一個舊的 Connect 項目(哦,找到編號 432497)抱怨
OBJECT_ID
. 如果我沒記錯的話,OBJECT_ID 並不總是尊重事務隔離級別(還有 OBJECT_NAME、SCHEMA_NAME 等)。查詢系統是安全的。它在 DDL 觸發器中是有意義的。我一是的,即使
read uncommitted
指定元數據函式也會阻塞而不是讀取另一個事務的髒數據 - Martin Smith我在這裡談論隔離級別問題:壞習慣:使用(某些)元數據“幫助器”功能。-亞倫伯特蘭