【问题标题】:Joining between multiple databases多个数据库之间的连接
【发布时间】:2013-12-10 05:22:06
【问题描述】:

更新我收到 DataBaseA.dbo.templates 的无效对象名称错误

我希望从同一服务器(本地)上的不同数据库中内连接两个表。

但我似乎无法让它工作。另外我不明白我应该如何处理我的连接字符串,因为我目前正在将当前连接设置为我的数据库的连接字符串。但在这个例子中,我试图在同一个查询中连接到两个不同的数据库。

这是我目前的 SQL 代码:

"SELECT a.template.*, b.c_template.* FROM DatabaseA.dbo.templates a INNER JOIN DatabaseB.dbo.c_template b ON a.id = b.template_id"

这是我的连接字符串:

<add name="Unit" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\DatabaseA.mdf;Integrated Security=True"
        providerName="System.Data.SqlClient" />
    <add name="Content" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\DatabaseB.mdf;Integrated Security=True"
        providerName="System.Data.SqlClient" />

【问题讨论】:

  • 您需要数据库 B 成为数据库 A 中的链接服务器(假设您将 SQL 命令发送到数据库 A)。
  • 我建议将此连接放在存储过程中。我没有尝试像您那样从应用程序发出联接,但我们一直在存储过程中执行此操作,没有任何问题。
  • 我如何链接数据库,Tobberoth?
  • 首先,确保您对两个数据库都有权限。如果您对两个数据库都有权限,那么 1 个连接字符串就足以执行此查询。可选:最好在存储过程中使用此查询。
  • Connectionstring 指向任何一个数据库就足够了。提供的登录应该适用于两个数据库。你试过了吗?

标签: c# sql database inner-join


【解决方案1】:

你知道表“模板”的架构所有者是“dbo”还是其他东西。您可以执行以下查询并查看是否找到该表?

SELECT * FROM Unit.dbo.templates.

如果没有找到该表,则应使用以下命令查找架构所有者:-

Use [Unit]
Go
sp_help templates

在下面的示例中,架构所有者是 dbo。当你执行你的,你会看到一些其他的模式所有者(例如 xyz)。使用该架构所有者。

SELECT * FROM Unit.xyz.template

如果您仍然无法找到该表,则听起来应用程序查询的默认数据库设置为表“tenplate”不存在的数据库。您可以尝试使用不同形式的连接字符串吗?以下连接字符串中的“myUsername”应该对 DatabaseA 和 DatabaseB 具有相同的所需权限:-

Server=myServerAddress;Database=myDataBase;User Id=myUsername;
Password=myPassword; 

示例:-

Server=localDB\v11.0;Database=DataBaseA;User Id=UserA;Password=UserAPassword; 

创建一个名为“UserA”的数据库用户,并拥有对 DatabaseA 和 DatabaseB 的适当访问权限。

【讨论】:

  • 它将架构声明为 dbo :/ 我怀疑我的 Connectionstring 是错误的:
  • 当我使用本地数据库时,我应该如何实现这个?
【解决方案2】:

只需使用DatabaseName..TableName

通过这种方式,您可以在使用时定期使用您的联接。

(你已经在 sql 中标记了它......至少我知道用 sql 这个[databasename..tablename] 有效)

【讨论】:

  • @F.R.I.E.N.D.S. SQL 是通用查询语言,你假设一个特定的实现
  • @MarkRotteveel 是的,我认为如果它也可以与 mdb 一起使用会很好,这对他会有帮助,这就是我发布的原因
  • databasename..tablename 暗示默认模式为“dbo”。您永远不应该假设架构,而应该明确声明它。例如数据库名.dbo.tablename.
  • 为什么我找不到 DatabaseName.dbo.Tablename?
  • @Mathias - 你知道表“模板”的模式所有者是否为“dbo”或者它是别的东西。您可以执行以下查询并查看是否找到该表? SELECT * FROM Unit.dbo.templates
【解决方案3】:

这样更有效:

  1. 从不同数据集中的不同数据库中读取数据。
  2. 使用 LINQ 加入他们。

【讨论】:

  • 我对 LINQ 不是很熟悉,所以我想看看我是否可以在没有它的情况下让它工作。
  • 有几个使用 LINQ join 的示例:code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9
  • 我不同意。如果每张表都有大量的记录,那么在服务器上执行join并在客户端返回结果会效率更高。
【解决方案4】:

在数据库中运行以下脚本以了解数据库所有者

sp_help YourTableName

然后看看所有者列下有什么

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多