異なるサーバー上のSQL Serverデータベースを統合:データ照回のベストプラクティス
SQL Server を使用して異なるサーバー上の 2 つのデータベースの 2 つのテーブルを結合してデータを照会する方法
異なるサーバー上の 2 つのデータベースの 2 つのテーブルを結合してデータを照会することは、複雑なタスクのように思えるかもしれませんが、実際にはそれほど難しくありません。以下の手順に従って、簡単に実行できます。
前提条件
- 2 台のサーバーに SQL Server がインストールされている
- 2 つのデータベース間にファイアウォールなどのネットワーク接続がある
- 両方のデータベースのテーブルに、結合に使用できる共通の列がある
手順
- 最初のデータベースに接続する
最初のデータベースに接続するには、以下の構文を使用します。
USE DatabaseName;
例:
USE MyDatabase1;
OPENQUERY(ServerName, 'SELECT * FROM DatabaseName.TableName');
OPENQUERY(Server2, 'SELECT * FROM MyDatabase2.MyTable2');
- 2 つのテーブルを結合する
2 つのテーブルを結合するには、JOIN
キーワードを使用します。
SELECT t1.column1, t1.column2, t2.column3
FROM MyDatabase1.MyTable1 AS t1
INNER JOIN OPENQUERY(Server2, 'SELECT * FROM MyDatabase2.MyTable2') AS t2
ON t1.common_column = t2.common_column;
注記
- 上記の例では、
INNER JOIN
を使用しています。これは、一致する行のみを返します。他の種類の結合 (例:LEFT JOIN
、RIGHT JOIN
、FULL JOIN
) を使用することもできます。 OPENQUERY
関数を使用する代わりに、分散クエリを使用することもできます。分散クエリを使用するには、最初に 2 つのサーバー間で分散クエリのサポートを有効にする必要があります。
以下のサンプルコードは、異なるサーバー上の 2 つのデータベースの 2 つのテーブルを結合してデータを照会する方法を示しています。
状況
AdventureWorks2019
という名前のデータベースがServer1
にあるSalesOrderHeader
とSalesOrderDetail
という 2 つのテーブルがAdventureWorks2019
データベースにあるSalesOrderHeader
テーブルにはSalesOrderID
という列があり、SalesOrderDetail
テーブルにはSalesOrderID
およびProductID
という 2 つの列があるServer2
にはProduct
という名前のデータベースがあるProduct
データベースにはProductID
とProductName
という 2 つの列がある
目標
SalesOrderHeader
テーブル、SalesOrderDetail
テーブル、および Product
テーブルを結合して、各注文の詳細 (製品名を含む) を表示する。
T-SQL コード
USE MyDatabase1;
SELECT
soh.SalesOrderID,
soh.OrderDate,
sod.ProductID,
p.ProductName
FROM SalesOrderHeader AS soh
INNER JOIN SalesOrderDetail AS sod
ON soh.SalesOrderID = sod.SalesOrderID
INNER JOIN OPENQUERY(Server2, 'SELECT * FROM Product') AS p
ON sod.ProductID = p.ProductID;
このコードの説明
- 最初の行 (
USE MyDatabase1;
) は、MyDatabase1
という名前のデータベースに接続します。 - 2 番目の行から 5 番目の行までは、
SalesOrderHeader
テーブル (soh
)、SalesOrderDetail
テーブル (sod
)、およびProduct
テーブル (p
) から列を選択します。 - 6 番目の行は、
SalesOrderHeader
テーブルのSalesOrderID
列とSalesOrderDetail
テーブルのSalesOrderID
列を結合します。 - 7 番目の行は、
SalesOrderDetail
テーブルのProductID
列とProduct
テーブルのProductID
列を結合します。 - 結果は、
SalesOrderID
、OrderDate
、ProductID
、およびProductName
の列を含むテーブルとして返されます。
異なるサーバー上の 2 つのデータベースのテーブルを結合するその他の方法
前述の方法に加えて、異なるサーバー上の 2 つのデータベースのテーブルを結合する方法は他にもいくつかあります。以下に、いくつかの方法をご紹介します。
データベースのエクスポートとインポート
最初の方法は、最初のサーバーから最初のデータベースをエクスポートし、2 番目のサーバーにインポートすることです。その後、2 番目のサーバーで、インポートしたデータベースの 2 つのテーブルを結合できます。
この方法は、データ量が小さい場合や、2 つのサーバー間で頻繁にデータを照会する必要がない場合に適しています。
ローカル テーブルの作成
ビューの作成
3 番目の方法は、最初のサーバーで最初のデータベースの 2 つのテーブルのビューを作成することです。その後、2 番目のサーバーからそのビューにクエリを実行できます。
この方法は、最初のデータベースを頻繁に変更する必要がない場合に適しています。
結合サーバーを使用する
4 番目の方法は、結合サーバーを使用して 2 つのデータベースを接続することです。結合サーバーは、複数のデータベースにアクセスしてクエリを実行できる単一の論理サーバーとして機能します。
この方法は、2 つのサーバー間で頻繁にデータを照会する必要がある場合や、データが分散されている場合に適しています。
最良の方法の選択
使用する方法は、特定の状況によって異なります。データ量、ネットワーク接続、およびパフォーマンス要件などの要因を考慮する必要があります。
sql sql-server database