SQL Server查询中架构名与表名区别及HR.Employee含义说明
关于
HR.Employee的含义解析 在你编写的select * from HR.Employee查询语境下,HR.Employee是SQL Server标准的架构.对象名两段式引用写法,默认指代HR架构下的Employee数据表,相关规则如下:
- SQL Server中架构(Schema)是数据库内部的对象命名空间/分组容器,用来按业务域归类对象、做细粒度权限管控。AdventureWorks作为官方示例库,本身就是按业务域划分架构的,HR对应人力资源域、Sales对应销售域、Production对应生产域、Person对应通用人员域,都是库内置的业务架构。
- SQL Server引用数据库对象的完整四段命名格式为
服务器实例名.数据库名.架构名.对象名,编写查询时可以从左向右省略已指定上下文的前缀:你当前已经连接到AdventureWorks数据库,因此可以省略服务器名、数据库名前缀,直接用架构名.对象名的格式引用对象。注意:不建议为了简写省略架构名。省略架构名后,SQL Server会优先在当前登录用户的默认架构下查找匹配对象,找不到再去dbo架构下检索,既会拖慢编译速度,也可能因为对象重名命中错误的目标、引发查询逻辑错误。
- 需要明确:
HR.Employee这个写法本身不天然绑定「数据表」这一种对象类型,它仅代表「HR架构下名为Employee的数据库对象」。只有当这个对象是可被FROM子句引用的类型(用户表、视图、表值函数、同义词)时,写在SELECT语句的FROM后面才会正常执行;如果HR架构下叫Employee的是存储过程、标量函数这类不能直接作为查询数据源的对象,语句会直接抛出对象无效的错误。
如果你要确认这个对象的具体类型,可以直接执行下面查询系统视图的语句验证:
SELECT s.name AS 架构名, o.name AS 对象名, o.type_desc AS 对象类型 FROM sys.objects o INNER JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE s.name = 'HR' AND o.name = 'Employee'
返回结果中如果对象类型列显示USER_TABLE,就说明这是一张用户自定义数据表;如果显示VIEW则为视图,其他结果对应不同的对象类型。
另外补充一个常见误区:很多新手容易把架构和早期版本的用户绑定概念搞混,SQL Server 2005之前架构和数据库用户是强绑定的,2005版本之后两者完全独立,HR是独立的命名容器,不是用户名。
内容的提问来源于stack exchange,提问作者Akash Mukherjee
相关产品推荐
相关产品推荐

