如何在SQL Server 2012中限定表名?

时间:2014-09-29 14:11:21

标签: sql sql-server database

假设我有一个名为MyDB的数据库,其中包含一个名为MyTable的表。我可以将其称为

MyDb.dbo.MyTable

但是,如果我在存储过程中执行此操作,然后使用其他名称部署数据库,则存储过程将不再有效。

如果我将其限定为

dbo.MyTable

然后它会工作,我可以将数据库命名为我想要的任何东西。但是,如果我不再知道在部署时将调用我的数据库,我就无法引用另一个数据库中的表。即我无法指定我真正想要的表是在另一个数据库中(在同一台服务器上),即

MyOtherDb.dbo.MyTable

这:http://www.sql-server-performance.com/2001/sql-best-practices/

  

使用所有者的名称前缀表名,因为这会改进   可读性,避免任何不必要的混淆。 Microsoft SQL Server   联机丛书甚至声明使用所有者名称限定表名   帮助执行计划重用,进一步提升绩效。

我是SQL Server的新手,并不完全确定所有者是什么。此外,许多其他资源都要求提供完全合格的名称"应该使用,而不是完全符合他们的意思"完全合格的名字"。

对不起,如果这是一个愚蠢的问题,但这里的最佳做法是什么?我现在很清楚这一点,而不是三个月后为自己解决这个问题并进行大量的重构。谢谢!

2 个答案:

答案 0 :(得分:3)

对同一数据库中的对象使用两个部件名称。

这意味着您可以使用不同的名称创建数据库的副本,而不必以三部分命名格式检查和更改数据库名称。

对于不同数据库中的对象,您需要使用三个部分名称(如果它是链接服务器,则需要四个)。

通常,您可以使用同义词来集中这些外部引用。这样可以更轻松地将它们重定向到开发中的其他位置。虽然同义词并不具备直接引用该对象的所有功能(例如TRUNCATE TABLE dbo.YourSynonymCREATE INDEX引用同义词不起作用。)

答案 1 :(得分:0)

Sybase中的所有者(另一个DBMS)类似于SQL Server中的Schema。完全限定名称意味着以下内容:

ServerName.DatabaseName.SchemaName.TableName(即使您的本地计算机也可以使用简单的SQL语句尝试此操作)

因此,除非您的查询针对链接服务器,否则您需要的是后面的3(DatabaseName.SchemaName.TableName),并且您的查询将永远不会出现重复表名称的问题。

为了清楚你的想法,需要注意几点:

  1. 存储过程可以并且通常存储在它反对的用户数据库中,因此它知道第一部分(除非当然是针对多个数据库,甚至更糟糕的是针对多个链接服务器)

  2. 存储过程是架构绑定对象(如果未指定,则使用创建用户的默认架构)