SQL-如何对多个表引用使用相同的数据库前缀

时间:2018-12-12 21:50:28

标签: sql sql-server variables select

SQL的新手...

我正在尝试写以下开头的东西:

SELECT someColumn
    FROM someTable

但是,在我的特殊情况下,表具有多个前缀,因此FROM语句看起来更像这样:

FROM someDatabase.dbo.someTable

我正在尝试重构现有查询,该查询需要多个联接,因此需要多个对上述路径前缀的引用(即someDatabase.dbo...)。

这似乎效率极低,但我似乎无法弄清楚如何分配一个我可以每次引用的变量,而不是引用每个表的整个路径。

请务必完全清楚,这些表的名称都在SQL Server Studio中以dbo开头,因此表名是实际的dbo.someTable,但我认为这似乎是一个额外的名称。前缀,但我很乐意将someDatabase设置为默认值(我尝试使用USE someDatabase,但该方法无效)或作为短变量(例如@db被引用为{{1 }}作为sudo代码示例。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

由于要从多个数据库中提取数据,因此没有麻烦的 繁琐的类型输入,但是第一次引用表时只需要完全限定的名称(database.schema.table)在您的查询中。到那时,您可以(并且包括我在内,有些人会认为您应该)对表进行别名。之后,您将只引用表别名,在这种情况下,它还将是数据库和架构别名。

通常来说,它看起来像这样:

Out-Projekt: <input type= "checkbox" id= "OUT"> <br> <br>
 <button  class = "buttonz" onclick = "berechnung()">Berechnen </button>          

<script>
function berechnung() {
  var checkbox = document.getElementById("OUT");

  if( checkbox.checked === true){
    console.log('checked');
  } else { 
    console.log('not checked');
  }
}
</script>

如果您使用有意义的别名,那么记住每个别名指的是什么以及它来自何处就足够简单了。而且,您绝对应该使用有意义的别名,正如Aaron在本文中指出的那样,我每周至少会向与我打交道的人发送电子邮件:Bad habits to kick : using table aliases like (a, b, c) or (t1, t2, t3)

答案 1 :(得分:0)

我不确定这是否能回答您的问题,但是如果您使用的是默认架构(dbo),则可以键入两个句点并跳过它。我意识到这只会为您节省一些输入时间(您仍然必须输入数据库名称),但这很重要。

-- just an example query, not intended to demonstrate anything except the shortcut
SELECT TOP 20 Task.Name,
              User.Name AS Assignee
FROM   TaskDatabase..Task AS Task -- two periods here instead of TaskDatabase.dbo.Task
       INNER JOIN UserDatabase..User AS USER
               ON Task.AssigneeId = User.UserId
ORDER  BY Task.Name 

除了默认模式,我认为这不适用于任何其他东西,但是我可能是错的。

答案 2 :(得分:0)

我不同意它的“效率极低”。如果您只是在谈论击键,那么有许多插件(甚至是Intellisense)可以节省您击键的时间。我使用一个称为SSMSToolsPack的SSMS插件来绑定各种代码段,但是Redgate和ApexSql甚至是VSCode也具有类似的功能。

如果您谈论的是代码过于冗长(因此可能较慢),实际上并非如此。实际上,使用完全限定的名称实际上会节省查询处理器一段时间,因为它不必猜测对象所在的位置以及省略数据库和架构后的含义。< / p>

无论哪种方式,养成完全限定对象名称的习惯都是一种好习惯。

就象对象的一部分一样,正如Aaron Bertrand指出的那样,这不是数据库对象的工作方式,除非您使用动态SQL,否则我不建议您打开动态蠕虫。

如果这都不令人满意,并且您不必键入数据库和架构前缀,那么您的选择基本上是使用SYNONYMsVIEWs。前者是关于将完全限定名称抽象为另一种格式的最接近的事情。后者使您可以更好地控制视图的内容返回什么,但是即使在那儿,也必须在视图主体中提供完全限定的对象。