《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語句
參考資料: