[初学者问题,在谷歌搜索这个简单问题的答案后,没有成功:]
在以下查询中执行了哪些操作(取自here,删除了DISTINCT
并添加了列标题):
USE AdventureWorks;
GO
SELECT OBJECT_NAME(object_id) AS ObjName
FROM master.sys.objects;
GO
我知道它是一个函数,返回给定对象id的对象名称。
但是,SELECT
命令的参数(即OBJECT_NAME(object_id)
)让我感到困惑,原因有两个:
SELECT
的论据是(通常)列名,而这里是值(在{{1}内} name
的列。master.sys.objects
的使用方式 - 它没有在查询表面上赋值;所以我唯一的猜测就是它在表面下以类似于object_id
函数的方式使用(即使用C#术语,foreach
) - 但我无法确定我的猜测是正确的。 那么,foreach object_id, fill the returned datatable with the datarow
在这里做了什么?
编辑:发表评论后,我会从另一个角度提出这个问题:
SELECT
是否以不同的方式引用其参数,因此当给定一个特定的id时,它返回一个值,当给出名称'object_id`时,它返回整个列?
答案 0 :(得分:4)
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
此查询返回对象的object_name,而不从select或子查询中的objects表引用对象名。
2)Object_ID是数据库中对象的标识符。这些对象可以是表,触发器,存储过程等。
您可以使用静态值或查询表中的值:
select OBJECT_NAME(1673317271)
select OBJECT_NAME(object_id)
FROM sys.objects
WHERE object_ID = 1673317271