《Windows Azure Platform 系列文章目录》
问题
1.我们在进行SQL Server开发的时候,经常会使用垮库查询。但是在默认情况下,使用Azure SQL Database不支持垮库查询。如下图:
2.我们执行垮库查询语句,如下:
SELECT A.CustomerID,A.FirstName, A.LastName,B.OrderID FROM CRMDB.dbo.CustomerInfo AS A LEFT JOIN OrderDB.dbo.OrderInfo AS B ON A.CustomerID=B.CustomerID
3.会出现以下的报错信息:
4.可以看到,在默认情况下,使用Azure SQL Database不支持垮库查询。
使用外部表:
准备工作
1.我们这里增加一些难度。我们在Azure SQL Database分别创建2个Server。如下图:
注意,为了避免出现跨Azure数据中心之间的延时,请尽量在同一个数据中心创建Server。笔者在中国东部数据中心,创建2个Server
2.我们在这2个Server下创建2个不同的Database,如下图:
3.使用SSMS,连接到ew79sank1x.database.chinacloudapi.cn,1433,数据库CRMDB,创建表CustomerInfo
create table dbo.CustomerInfo ( CustomerID nvarchar(100) not null primary key, FirstName nvarchar(100) not null, LastName nvarchar(100) not null ) Go insert into CustomerInfo(CustomerID,FirstName,LastName) values ('001','Jason','Zhang'), ('002','Peter','Huang'), ('003','Jason','Hu'), ('004','Mike','Lee')
4.使用SSMS,连接到lcqyvtqri1.database.chinacloudapi.cn,1433,数据库OrderDB,创建表OrderInfo
create table dbo.OrderInfo ( OrderID nvarchar(100) not null, CustomerID nvarchar(100) not null, ) Go insert into OrderInfo(OrderID,CustomerID) values ('2013010100001','001'), ('2013010100002','001'), ('2013010100003','002'), ('2013010100004','002'), ('2013010100005','002'), ('2013010100006','003'), ('2013010100007','004')
创建外部表
1.使用SSMS,连接到ew79sank1x.database.chinacloudapi.cn,1433,数据库CRMDB。执行以下脚本
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'; CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred WITH IDENTITY = '<username>', SECRET = '<password>';
请注意:上面的<username>和<password>,是连接到lcqyvtqri1.database.chinacloudapi.cn,1433,数据库OrderDB的用户名和密码。注意是连接到另外的Server和Databse,不是自己。
2.执行以下命令
CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc WITH (TYPE = RDBMS, LOCATION = 'lcqyvtqri1.database.chinacloudapi.cn', DATABASE_NAME = 'OrderDB', CREDENTIAL = ElasticDBQueryCred, ) ;
连接到lcqyvtqri1.database.chinacloudapi.cn,1433
3.创建外部表
CREATE EXTERNAL TABLE dbo.OrderInfo ( OrderID nvarchar(100) not null, CustomerID nvarchar(100) not null ) WITH ( DATA_SOURCE = MyElasticDBQueryDataSrc)
注意:上面创建的External Table的Table Name和Table Schema,必须与Azure SQL Database: lcqyvtqri1.database.chinacloudapi.cn,1433,数据库OrderDB中的表OrderInfo的Table Name和Table Schema一样。
4.执行完毕后,我们可以在ew79sank1x.database.chinacloudapi.cn,1433,查看到原本保存在lcqyvtqri1.database.chinacloudapi.cn,1433的数据库OrderDB中的表dbo.OrderInfo。如下图:
5.我们可以执行以下语句,查询dbo.OrdrInfo表的内容:
SELECT [OrderID],[CustomerID] FROM [dbo].[OrderInfo]
执行结果,就是我们在lcqyvtqri1.database.chinacloudapi.cn,1433数据库OrderDB中的表dbo.OrderInfo的值
6.执行查询语句:
SELECT A.CustomerID,A.FirstName, A.LastName,B.OrderID FROM dbo.CustomerInfo AS A LEFT JOIN dbo.OrderInfo AS B ON A.CustomerID=B.CustomerID
如下图:
Update 2019-05-23
请注意,虽然CRMDB database中包含了OrderDB库中的表dbo.OrderInfo,但是我们在CRMDB database不能对dbo.OrderInfo执行插入操作,会报DML错误
我们必须通过
exec sp_execute_remote N'MyElasticDBQueryDataSrc', --这是步骤2中,指定的Data Source N'INSERT INTO OrderInfo(OrderID,CustomerID VALUES ('2013010100008','005')' --这是具体的T-SQL语句
即我们通过在远端(Server: lcqyvtqri1.database.chinacloudapi.cn),执行T-SQL语句
参考资料: