查询而无需指定表的架构


10

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

在表属性中,它将“ erpadmin”列为数据库架构。当我编写查询时,我现在必须包含“ erpadmin”。在所有表名前面,这令人困惑。

当前结果:

select *
from erpadmin.tablename

所需结果:

select *
from  tablename

Answers:


23

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

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

如果您希望使用非dbo模式,则另一种方法是将用户的默认模式设置为,erpadmin如果您不指定模式,它将使用默认模式。(sysadmin固定服务器角色的成员将忽略,DEFAULT_SCHEMAdbo默认使用。)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

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


17

这是一个经典案例,说明为什么在访问数据库对象时应指定架构名称。如果未指定该对象,并且您尝试使用非默认架构访问对象,那么您将遇到当前遇到的问题。

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

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

这并没有造成混淆,这是一个明确的命名约定。我建议您坚持使用该术语以避免对象改组和不一致。


3
始终使用两部分名称的另一个原因是避免出现多个用户执行同一代码(例如select ... from table5 ;)并获得不同结果的情况。这不利于计划缓存,也不利于故障排除(提示支持人员,“该查询在此处运行正常”)。此外,为函数和视图建立索引所需的模式绑定需要两个部分的名称。TLDR:不要再懒了-使用两个零件名称。
Greenstone Walker

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'

4

您的麻烦很可能是由于迁移的方式造成的。除非您被认为是所有者,否则不应将东西附加到您的用户。

那里的模式可以帮助您合理地分隔表。假设您有一个用于人力资源部门的资源表,并且想要一个用于生产部门的单独的资源表,同时将两者都保存在同一数据库中。在这种情况下,您可以有两个名为资源的表,一个在生产模式中,另一个在HR模式中。这就是为什么必须指定shcemas的原因,除非您将内容带入默认架构。

如果您不出于其他原因重做迁移,那么Adam Wenger的转职应该是一个明智的选择。


-2

使用“ USE [tablename] 查询” 启动命令。您的查询没有要引用的关联数据库,并且您正在查看的数据库不是登录用户的默认数据库。在查询窗口的顶部,它可能显示“ master”。


3
你的意思是[database_name]吧?
dezso
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.