OBJECT_NAME (Transact-SQL)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)
返回架构范围内对象的数据库对象名称。 有关架构范围内的对象的列表,请参阅 sys.objects (Transact-SQL)。
语法
OBJECT_NAME ( object_id [, database_id ] )
参数
object_id
要使用的对象的 ID。 object_id 的数据类型为 int,并假定为指定数据库或当前数据库上下文中的架构范围内的对象。
database_id
要在其中查找对象的数据库的 ID。database_id 为 int。
返回类型
sysname
例外
出现错误时或调用方没有查看对象的权限时,将返回 NULL。 如果目标数据库的 AUTO_CLOSE 选项设置为 ON,则此函数将打开此数据库。
用户只能查看符合如下条件的安全对象的元数据:该安全对象为该用户所有,或已授予该用户对该安全对象的权限。 也就是说,如果用户对该对象没有任何权限,则那些会生成元数据的内置函数(如 OBJECT_NAME)可能返回 NULL。 有关详细信息,请参阅 Metadata Visibility Configuration。
权限
需要对对象拥有 ANY 权限。 若要指定数据库 ID,还需要对数据库拥有 CONNECT 权限,或者必须启用 guest 帐户。
备注
系统函数可以在选择列表、WHERE 子句和任何允许使用表达式的地方使用。 有关详细信息,请参阅表达式和 WHERE。
由此系统函数返回的值使用当前数据库的排序规则。
默认情况下,SQL Server 数据库引擎假定 object_id 在当前数据库的上下文中。 在其他数据库中引用 object_id 的查询将返回 NULL 或错误的结果。 例如,以下查询中当前数据库的上下文是 AdventureWorks2022。 数据库引擎将尝试返回在该数据库(而非查询的 FROM 子句中指定的数据库)中指定的对象 ID 的对象名称。 因此,会返回不正确的信息。
USE AdventureWorks2022;
GO
SELECT DISTINCT OBJECT_NAME(object_id)
FROM master.sys.objects;
GO
您可以通过指定数据库 ID 在其他数据库的上下文中解析对象名。 以下示例在 master
函数中指定 OBJECT_SCHEMA_NAME
数据库的数据库 ID,并返回正确的结果。
USE AdventureWorks2022;
GO
SELECT DISTINCT OBJECT_SCHEMA_NAME(object_id, 1) AS schema_name
FROM master.sys.objects;
GO
示例
A. 在 WHERE 子句中使用 OBJECT_NAME
以下示例将返回来自对象的 sys.objects
目录视图的列,该对象是通过 OBJECT_NAME
在 WHERE
语句的 SELECT
子句中指定的。
USE AdventureWorks2022;
GO
DECLARE @MyID INT;
SET @MyID = (SELECT OBJECT_ID('AdventureWorks2022.Production.Product',
'U'));
SELECT name, object_id, type_desc
FROM sys.objects
WHERE name = OBJECT_NAME(@MyID);
GO
B. 返回对象架构名称和对象名称
以下示例返回所有缓存查询计划(为非临时语句或预定义语句)的对象架构名称、对象名称和 SQL 文本。
SELECT DB_NAME(st.dbid) AS database_name,
OBJECT_SCHEMA_NAME(st.objectid, st.dbid) AS schema_name,
OBJECT_NAME(st.objectid, st.dbid) AS object_name,
st.text AS query_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE st.objectid IS NOT NULL;
GO
C. 返回由三部分组成的对象名称
以下示例返回所有数据库中所有对象的数据库名称、架构名称和对象名称,同时返回 sys.dm_db_index_operational_stats
动态管理视图中的其他所有列。
SELECT QUOTENAME(DB_NAME(database_id))
+ N'.'
+ QUOTENAME(OBJECT_SCHEMA_NAME(object_id, database_id))
+ N'.'
+ QUOTENAME(OBJECT_NAME(object_id, database_id))
, *
FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL);
GO
示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)
D. 在 WHERE 子句中使用 OBJECT_NAME
以下示例将返回来自对象的 sys.objects
目录视图的列,该对象是通过 OBJECT_NAME
在 WHERE
语句的 SELECT
子句中指定的。 (对象编号(在下面的示例中为 274100017)各不相同。 若要测试此示例,请通过在数据库中执行 SELECT name, object_id FROM sys.objects;
来查看有效的对象编号。)
SELECT name, object_id, type_desc
FROM sys.objects
WHERE name = OBJECT_NAME(274100017);
另请参阅
元数据函数 (Transact-SQL)
OBJECT_DEFINITION (Transact-SQL)
OBJECT_ID (Transact-SQL)