查询而无需指定表的架构

Ram*_*ale 11 sql-server-2008 sql-server sql-server-2000

我将一堆表从 SQL Server 2000 导入到我的 2008 数据库中。所有导入的表都以我的用户名作为前缀,例如:erpadmin.tablename

在表属性中,它列出了 'erpadmin' 作为 db 架构。当我编写查询时,我现在必须包含“erpadmin”。在所有令人困惑的表名前面。

当前结果:

select *
from erpadmin.tablename
Run Code Online (Sandbox Code Playgroud)

想要的结果:

select *
from  tablename
Run Code Online (Sandbox Code Playgroud)

Ada*_*ger 23

如果您想像在 SQL Server 2000 中一样重新使用 dbo 架构,您可以将表移回 dbo 架构:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;
Run Code Online (Sandbox Code Playgroud)

如果您喜欢非 dbo 架构,另一种方法是将用户的默认架构设置为,erpadmin然后如果您未指定架构,它将使用该架构作为默认架构。(sysadmin 固定服务器角色的成员在默认情况下忽略DEFAULT_SCHEMA并使用dbo。)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;
Run Code Online (Sandbox Code Playgroud)

您拥有的两部分名称 (schema.table) 是一个很好的习惯,因此您可以明确指出您所指的是哪个表。某些功能要求您使用由两部分组成的名称,索引视图就是一个示例。


Tho*_*ger 17

这是为什么在访问数据库对象时应该指定模式名称的经典案例。当它未指定并且您尝试访问非默认模式中的对象时,您将遇到您现在看到的问题。

真正的解决方法是将您的应用程序(或您现在拥有的任何导致问题的查询代理)更改为明确的。

当我编写查询时,我现在必须包含“erpadmin”。在所有令人困惑的表名前面。

这并不令人困惑,这是一个明确的命名约定。我建议您坚持使用该命名法以避免对象改组和不一致。

  • 始终使用两部分名称的另一个原因是避免多个用户执行相同代码(例如`select ... from table5;`)并得到不同结果的情况。这不利于计划缓存,也不利于故障排除(提示支持人员,“该查询在这里运行良好”)。此外,函数和视图的索引所需的模式绑定需要两个部分名称。TLDR:停止懒惰 - 使用两个部分名称。 (3认同)

Igo*_*nko 7

作为@AdamWenger 回答的补充。要创建用于传输到另一个架构的脚本,您可以使用以下脚本

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'
Run Code Online (Sandbox Code Playgroud)