错误消息:此版本的 SQL Server 不支持对“beA2BAero.dbo.aircraft”中的数据库和/或服务器名称的引用

Posted

技术标签:

【中文标题】错误消息:此版本的 SQL Server 不支持对“beA2BAero.dbo.aircraft”中的数据库和/或服务器名称的引用【英文标题】:error message : Reference to database and/or server name in 'beA2BAero.dbo.aircraft' is not supported in this version of SQL Server 【发布时间】:2022-01-12 17:14:42 【问题描述】:

我想在同一服务器的多个数据库中使用此查询,在本地它可以工作,但是当我想在 sql server 中使用与 azure 服务器连接的相同查询时,我收到此消息错误消息:

此版本的 SQL Server 不支持引用“beA2BAero.dbo.aircraft”中的数据库和/或服务器名称。

Select count(*) From [xxx1].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx2].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx3].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx4].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx5].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx6].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx7].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx8].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx9].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx10].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx11].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx12].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx13].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx14].[dbo].[aircraft]
UNION ALL
Select count(*) From [xxx15].[dbo].[aircraft]

【问题讨论】:

显然您使用的是 Azure SQL 数据库。如果您这样做,错误会告诉您问题;你不能那样做。不允许跨数据库查询。如果您需要这样的解决方案,那么 Azure SQL 数据库是错误的解决方案您的数据不应位于 15 个不同的数据库中(可能后者比前者更多)。 抱歉,这不是答案 你为什么首先使用这样的查询?你想通过使用 15 个不同的数据库来实现什么?这很重要。自 2016 年以来的所有 SQL Server 版本都支持所有版本的表分区,甚至是 LocalDB。 @gladiator06m 它一个答案。你试图做的事情是不可能的。时期。下一个问题是你为什么要这样做?这是 20 年前需要的,但在 2005 年引入表分区时已经过时(ish?我不记得了)。列存储索引等技术可以在压缩数据的同时显着提高性能,从而减少对横向扩展的需求 为什么很重要。数据管理?表现?多租户?您是否正在尝试管理大量数据?然后使用表分区。您是否正在尝试提高性能?只需购买更多 DTU 即可更轻松地做到这一点。或使用 Azure 横向扩展功能之一。一旦您解释了为什么尝试使用联合视图,人们将能够提出解决方案 【参考方案1】:

简单的答案是 Azure 不支持跨数据库引用。

但是,有一种方法可以设置它,以便您可以使用SELECTs。基本上你需要设置外部数据源。

This guide 可以让您了解为用于访问外部数据源的凭据设置用户权限的细节。

一旦设置了权限,您实际上需要在每个数据库中执行此操作:

CREATE EXTERNAL DATA SOURCE [MyDataSourceName]
 WITH 
 ( TYPE = RDBMS,
   LOCATION=[MyServerLocation],
   DATABASE_NAME = [MyDBName],
   CREDENTIAL = QueryCredential
 );

您可以从那里创建基于外部数据源的表:

CREATE EXTERNAL TABLE [MyExternalTable](
    ...
) WITH (DATA_SOURCE = [MyDataSourceName])
GO

那么你就可以按照以下方式做一些事情:

Select count(*) From [dbo].[aircraft]
UNION ALL
Select count(*) From [MyExternalTable]
UNION ALL
...

不过,这样做并不是特别建议,因为它会增加更多的攻击机会。

【讨论】:

以上是关于错误消息:此版本的 SQL Server 不支持对“beA2BAero.dbo.aircraft”中的数据库和/或服务器名称的引用的主要内容,如果未能解决你的问题,请参考以下文章