我在同一个SQL Azure服务器上有2个DB,并且我在两个DB上都有相同的表(TB1),现在我想从DB2的TB1读取数据并将数据插入到DB1的TB1中。 我正在使用以下查询但收到错误。
insert into TB1 select 1,* from [DB2].dbo.TB1
错误消息
Msg 40515,Level 15,State 1,Line 16
此版本的SQL Server不支持在“DB2.dbo.TB1”中引用数据库和/或服务器名称。
答案 0 :(得分:5)
是的,您可以在SQL Azure上使用弹性查询功能。这是您执行跨数据库查询的唯一方法。
以下是详细的查询:
在DB1中运行以下查询(因为您说过从DB2读取TB1并将这些数据插入到DB1中的TB2中)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'STro*ngPaSSe0rD';
CREATE DATABASE SCOPED CREDENTIAL Login
WITH IDENTITY = 'Login',
SECRET = 'STro*ngPaSSe0rD';
CREATE EXTERNAL DATA SOURCE RemoteReferenceData
WITH
(
TYPE=RDBMS,
LOCATION='myserver.database.windows.net',
DATABASE_NAME='DB2',
CREDENTIAL= Login
);
CREATE EXTERNAL TABLE [dbo].[TB1]
(
[Columns] [DataTypes]
)
WITH (DATA_SOURCE = [RemoteReferenceData])
完成这些步骤后,您可以像普通表一样查询外部表。虽然使用外部表时存在一些限制,但您无法将数据插入 EXTERNAL TABLE(参考表)< /强>
答案 1 :(得分:0)
答案 2 :(得分:0)
Azure支持此跨数据库查询功能since 2015,但需要一些extra setup才能工作和弹性查询。
第一步是创建安全凭证:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL DB2Security
WITH IDENTITY = '<username>',
SECRET = '<password>';
&#34;用户名&#34;和#34;密码&#34;应该是用于登录DB2数据库的用户名和密码。
现在您可以使用它来定义外部数据源,因此DB1可以连接到DB2:
CREATE EXTERNAL DATA SOURCE DB2Access
WITH (
TYPE=RDBMS,
LOCATION='myservernotyours.database.secure.windows.net',
DATABASE_NAME='DB2',
CREDENTIAL= DB2Security);
最后,使用以前的外部数据源将TB1作为外部表映射到DB2数据库:
CREATE EXTERNAL TABLE dbo.TB1FromDB2(
ID int,
Val varchar(50))
WITH
(
DATA_SOURCE = DB2Access);
您也可以使用Azure SQL Data Sync完成此操作,但数据会复制到一个数据库中,此功能仍然是预览版本(May / 2018),您始终可以看到最旧的数据(最小的可配置间隔时间)每次同步都是5分钟。)