SQL Azure (18) 使用External Table實現垮庫查詢


  《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語句

 

 

  參考資料:

https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-getting-started-vertical/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM