SELECT OBJECT_NAME(OBJECT_ID)如何运作?

时间:2017-01-12 20:37:18

标签: sql sql-server

[初学者问题,在谷歌搜索这个简单问题的答案后,没有成功:]

在以下查询中执行了哪些操作(取自here,删除了DISTINCT并添加了列标题):

USE AdventureWorks;
GO
SELECT OBJECT_NAME(object_id) AS ObjName
FROM master.sys.objects;
GO

我知道它是一个函数,返回给定对象id的对象名称。

但是,SELECT命令的参数(即OBJECT_NAME(object_id))让我感到困惑,原因有两个:

  1. 我认为SELECT的论据是(通常)列名,而这里是(在{{1}内} name的列。
  2. 我不明白master.sys.objects的使用方式 - 它没有在查询表面上赋值;所以我唯一的猜测就是它在表面下以类似于object_id函数的方式使用(即使用C#术语,foreach) - 但我无法确定我的猜测是正确的。
  3. 那么,foreach object_id, fill the returned datatable with the datarow在这里做了什么?

    编辑:发表评论后,我会从另一个角度提出这个问题:

    SELECT是否以不同的方式引用其参数,因此当给定一个特定的id时,它返回一个值,当给出名称'object_id`时,它返回整个列?

1 个答案:

答案 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