web-dev-qa-db-ja.com

異なるサーバーのテーブルを結合する

ストアドプロシージャで異なるサーバーのテーブルを結合する方法はありますか?

14
el ninho

詳細がなければ、直接例を示すことは困難ですが、基本的な考え方は次のとおりです。

まず、ストアドプロシージャの外で、ホストサーバー(ストアドプロシージャが存在するサーバー)は、(場合によっては)ログイン情報を含めて、2番目のサーバーについて知る必要があります。

メインサーバーで、sp_addlinkedserverストアドプロシージャを実行します。これは一度だけ行う必要があります:

exec sp_addlinkedserver @server=’(your second server)‘;

Ifこの2番目のサーバーにログイン情報を提供する必要があります(たとえば、プロセスは、最初のデータベース接続で使用されるのと同じ資格情報でログインできない)、sp_addlinkedsrvloginストアドプロシージャを使用してログインします:

exec sp_addlinkedsrvlogin @rmtsrvname=’(your second server)‘,@useself=false, @rmtuser=’yourusername‘, @rmtpassword=’yourpassword‘;

次に、ストアドプロシージャで、2番目のサーバーのテーブルを指定できます。

SELECT table1.*
FROM table1
INNER JOIN [secondserver].[database].[schema].[table] AS table2 ON
    table1.joinfield = table2.joinfield
14
scott.korin

1。exec sp_helpserverを使用しているリンクサーバーがあるかどうかを確認します

2。サーバーが返されない場合はLinkedではなく、追加する必要があります。 それ以外の場合は、手順3に進みます

Sql Server 2008 R2の場合は、Server Object > Linked Servers > Add new Linked Serverに移動します

または

exec sp_addlinkedserver @server='ServerName'; 

セカンダリサーバーに次のように接続します...

exec sp_addlinkedsrvlogin 
@rmtsrvname='ServerName'
, @useself=false
, @rmtuser='user'
, @rmtpassword='Password';

4。これで、2つの異なるサーバーのテーブルを結合できます。

SELECT 
    SRV1.*
FROM 
    DB1.database_name.dbo.table_name SRV1
        INNER JOIN DB2.database_name.dbo.table_name SRV2
        ON SRV1.columnId = SRV2.columnId
GO
3
ѺȐeallү

テーブルに参加する前に、まず2つのサーバーをリンクする必要があります。それらがリンクされたら、以下のクエリを使用して、サーバー、データベース、テーブルの名前を置き換えることができます。

以下のSQLをDB2で実行することを忘れないでください。

EXEC sp_addlinkedserver DB1
GO

-- below statement connects sa account of DB2 to DB1
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'DB1', @useself = 'false', @locallogin = 'sa', @rmtuser = 'sa', @rmtpassword = 'DB1 sa pwd'
GO

SELECT a.columns 
FROM DB1.database_name.dbo.table_name a
INNER JOIN DB2.database_name.dbo.table_name b
ON a.columnId = b.columnId
GO

サーバーのリンク- http://msdn.Microsoft.com/en-us/library/ms188279.aspx

2
avakharia

以下の構文でクエリを記述して、SQL Serverの他のサーバーに参加できます。

SELECT table_1.*  
FROM [Database_1].[dbo].[Table_1] table_1
INNER JOIN  [IP_OF_SERVER_2].[Database_2].[dbo].[Table_2] table_2 ON table_1.tablekey COLLATE DATABASE_DEFAULT  = table_2.tablekey COLLATE DATABASE_DEFAULT

p/s:エンコードするCOLLATE DATABASE_DEFAULT、ベローズエラーの防止等しい操作での「Vietnamese_CI_AS」と「SQL_Latin1_General_CP1_CI_AS」の間の照合の競合を解決できません。

0
Thanh Phi