當我使用有效的物件名稱呼叫 OBJECT_ID 時,我總是得到空值。例如
use [My-Database];
declare @objectId int;
SELECT * FROM sys.objects WHERE name = 'DF_FieldStatusTypes_DisplayOrder'
SELECT @objectId = object_id FROM sys.objects WHERE name = 'DF_FieldStatusTypes_DisplayOrder'
SELECT @objectId
SELECT object_name(@objectId)
SELECT object_id(object_name(@objectId))
SELECT object_id('DF_FieldStatusTypes_DisplayOrder')
產生的結果如下:
(1) DF_FieldStatusTypes_DisplayOrder| 753437758 | NULL | 5 | 241435934 | D | DEFAULT_CONSTRAINT | 2020-10-17 11:08:13.520 | 2020-10-17 11:08:13.520 | 0 | 0 | 0
(2) 753437758
(3) DF_FieldStatusTypes_DisplayOrder
(4) NULL
(5) NULL
結果 1 到 3 是準確的,但 4 和 5 總是回傳 NULL。我在下面參考的 Stack 問題與此類似,并參考了 Microsoft的 OBJECT_ID 文章,其中指出:
...如果用戶對物件沒有任何權限,則元資料發射、內置函式(如 OBJECT_ID)可能會回傳 NULL。
但是,完全相同的資訊在OBJECT_NAME 文章的例外部分中說明
然而,在我的例子中,OBJECT_NAME 函式被成功呼叫,并且 OBJECT_ID 總是回傳 null。
我錯過了什么?
類似問題
為什么object_id總是回傳null?
uj5u.com熱心網友回復:
這是在黑暗中刺傷,但我懷疑為什么在你的第一個結果集中。schema_id有一個值5表示它不在dbo架構上。因此,我懷疑您的默認架構不是所述物件所在的架構。
采取以下陳述:
CREATE TABLE dbo.SomeTable (ID int
CONSTRAINT DF_ID
DEFAULT 0);
GO
DECLARE @objectId int;
SELECT *
FROM sys.objects
WHERE name = 'DF_ID';
SELECT @objectId = object_id
FROM sys.objects
WHERE name = 'DF_ID';
SELECT @objectId;
SELECT OBJECT_NAME(@objectId);
SELECT OBJECT_ID(OBJECT_NAME(@objectId));
SELECT OBJECT_ID('DF_ID');
GO
DROP TABLE dbo.SomeTable;
這將為所有資料集回傳一個非NULL值。db<>小提琴
現在讓我們使用不同的模式,這不是我的默認設定。
CREATE SCHEMA another;
GO
CREATE TABLE another.SomeTable (ID int
CONSTRAINT DF_ID
DEFAULT 0);
GO
DECLARE @objectId int;
SELECT *
FROM sys.objects
WHERE name = 'DF_ID';
SELECT @objectId = object_id
FROM sys.objects
WHERE name = 'DF_ID';
SELECT @objectId;
SELECT OBJECT_NAME(@objectId);
SELECT OBJECT_ID(OBJECT_NAME(@objectId));
SELECT OBJECT_ID('DF_ID');
GO
DROP TABLE another.SomeTable;
GO
DROP SCHEMA another
另一方面,這會回傳您擁有的結果:db<>fiddle
那么,這是為什么呢?好吧,OBJECT_NAME只回傳物件的名稱,而不是名稱和架構。因此,DF_ID將被推斷為DF_ID模式上的物件dbo;dbo架構上沒有具有該名稱的此類物件。
如果包含架構名稱,您將得到結果:db<>fiddle
當然,您永遠不會使用物件 id 來獲取物件名稱,來獲取物件名稱,所以您遇到的問題有點荒謬。
uj5u.com熱心網友回復:
您缺少架構。從sys.objects結果中可以看出該物件屬于schema_id = 5。所以試試:
SELECT OBJECT_ID(SCHEMA_NAME(5) N'.' OBJECT_NAME(@objectId));
uj5u.com熱心網友回復:
我錯過了什么?
您的sys.objects查詢不考慮物件架構,無論表架構如何,都將回傳行。當表不在您的默認模式中并且物件名稱不合格時OBJECT_ID將回傳。NULL
嘗試模式限定約束名稱。dbo架構示例:
SELECT OBJECT_ID('dbo.DF_FieldStatusTypes_DisplayOrder');
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431787.html
下一篇:SQL聚合邏輯操作
