2012-03-19 55 views
0

我必须参加从多个数据库查询,类似的查询:如何使从多个数据库

SELECT T1.*, T2.* FROM DatabaseA.dbo.Table1 AS T1 
INNER JOIN DatabaseB.dbo.Table2 AS T2 ON T1.ID = T2.ID 

我的问题:

  • 我应该如何设置的System.Data.SqlClient.SqlConnection连接字符串?我应该省略还是留空Initial Catalog?我应该把它设置为DatabaseA
  • 这是执行此任务的好方法吗?我正在考虑准备第三个没有表格的数据库,但是用这个视图SELECT(我不能在现有的数据库中放置一个视图)。查询通常在10/15秒内执行,但用户必须等待,所以即使少了几秒钟,也不会感激。

所有数据库共享相同的登录凭证。

回答

2

这取决于您的连接字符串中的登录超过Initial Catalog

只要您使用的登录名具有从两个数据库中的两个表中查询所需的权限,就可以在连接字符串中指定任一数据库。

横跨多个数据库的查询没有任何内在错误,所以您提出的解决方案对我来说看起来不错。

请注意,如果您是设计这些数据库的人,并确定哪些数据表应存在于哪些数据库中,那么跨数据库没有参照完整性,那么理想情况下任何相互关联的表都应该存在于单一数据库。

+0

是的,所有数据库共享相同的登录凭据。你认为使用第三个数据库有更好的视角(用于性能和设计)吗? (查询通常在10/15秒内执行,但用户必须等待,因此即使少数几秒钟也不会被理解)。 – 2012-03-19 15:43:12

+1

我不会建议创建第三个数据库以仅包含视图...每个创建的数据库都有管理开销,所以您应该尽可能地限制它。我会尝试获得在任一现有数据库中创建视图的权限......但是,除非您计划对视图建立索引,否则我认为这不会提高查询的性能。 – 2012-03-19 15:45:47

+0

不幸的是,表格是相关的,但法律规定将它们分割到多个数据库中(我感到很幸运,它们至少在同一台服务器上)。视图将被编入索引,但我会等待几个月的反馈来调整它。谢谢,我想这就是全部! – 2012-03-19 15:56:50

1

无论数据库如何,连接字符串都以用户名的权限连接到数据库。如果用户有权执行查询,则根本没有问题。

1

初始目录将是您在不使用DBNAME.dbo.TABLENAME的情况下查询的目录。 所以,如果你选择DatabaseA作为初始目录,你可以查询这样的:

SELECT T1.*, T2.* 
FROM Table1 AS T1 
INNER JOIN DatabaseB.dbo.Table2 AS T2 ON T1.ID = T2.ID 

的初始目录只是意味着默认的数据库。

如果登录可以访问这两个数据库,则在使用全名时,哪一个是默认设置并不重要。

性能: 10/15秒听起来很长时间。您应该能够通过使用索引或更好的查询设计来改进查询并将其降低。然而,制作意见不会改善延误。 如果您需要帮助,请提供更多详细信息。