Sql-Server

OBJECT_ID(…) 函式與加入 sys.tables 和 sys.schemas

  • September 17, 2021

在查詢特定表的元數據時,我可以

  1. 使用該OBJECT_ID功能
  2. 加入相關的系統表(sys.tablessys.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

相關的,相關的。-我一個

我在這裡談論隔離級別問題:壞習慣:使用(某些)元數據“幫助器”功能。-亞倫伯特蘭

引用自:https://dba.stackexchange.com/questions/299778