[一个初学者问题,在谷歌上搜索这个简单问题的答案后,没有成功:]
以下查询中正在执行的操作(取自此处,删除了DISTINCT并添加了列标题):
USE AdventureWorks;
GO
SELECT OBJECT_NAME(object_id) AS ObjName
FROM master.sys.objects;
GO
Run Code Online (Sandbox Code Playgroud)
我知道它是一个函数,返回给定对象 id 的对象名称。
但是,SELECT命令的参数(即OBJECT_NAME(object_id))让我感到困惑,原因有二:
SELECT是(好吧,通常)一个列名,而这里它是一个值(在 的name列内master.sys.objects)。object_id- 它没有在查询表面分配值;所以我唯一的猜测是它在表面下以类似于foreach函数的方式使用(即,使用 C# 术语,foreach object_id, fill the returned datatable with the datarow) - 但我不能确定我的猜测是正确的。那么,SELECT这里正在做什么?
编辑:以下评论,我会从另一个角度问它:
OBJECT_NAME()引用它的参数是否不同,所以当它被赋予一个特定的 id 时,它返回一个值,当给定名称“object_id”时,它返回整个列?
1) 是的,您正在选择列名称。您正在从 sys.objects 表中选择 object_id。您根本没有与表中的 object_name 进行交互。正如 Aaron 在他的评论中提到的,OBJECT_NAME() 只是一个返回值/object_id 的函数。例如
select OBJECT_NAME(object_id)
FROM (
select [object_id]
FROM sys.objects) x
Run Code Online (Sandbox Code Playgroud)
此查询返回对象的 object_name,而无需在选择或子查询中引用对象表中的对象名称。
2)Object_ID 是数据库中对象的标识符。这些对象可以是表、触发器、存储过程等。
您可以使用静态值或从表中查询值:
select OBJECT_NAME(1673317271)
select OBJECT_NAME(object_id)
FROM sys.objects
WHERE object_ID = 1673317271
Run Code Online (Sandbox Code Playgroud)