web-dev-qa-db-ja.com

SQL Serverリンクサーバーのクエリ例

Management Studioで、2つのリンクサーバー間でクエリを実行/結合しようとしています。これは、リンクされたdbサーバーを使用した正しい構文ですか?

select foo.id 
from databaseserver1.db1.table1 foo, 
     databaseserver2.db1.table1 bar 
where foo.name=bar.name

基本的に、dbサーバー名をdb.tableの前に付けるだけですか?

82
bmw0128

形式はおそらく次のとおりです。

<server>.<database>.<schema>.<table>

例:DatabaseServer1.db1.dbo.table1


Update:これは古い質問であり、私が持っている答えは正しいことを知っています。ただし、これにつまずいた人は、いくつかのことを知っているはずです。

つまり、結合状況でリンクサーバーに対してクエリを実行すると、リンクサーバーからの全体テーブルがにダウンロードされる可能性があります結合操作を行うためにクエリが実行されるサーバー。 OPの場合、table1DB1table1DB2の両方が、おそらくDB3という名前のクエリを実行するサーバーに転送されます。

大きなテーブルがある場合、これはmayの結果、実行に時間がかかる操作になります。結局のところ、メモリやディスクの転送速度よりも桁違いに遅いネットワークトラフィックの速度に制約されています。

可能であれば、ローカルテーブルに参加せずにリモートサーバーに対して単一のクエリを実行し、必要なデータを一時テーブルにプルします。次に、そのクエリを実行します。

それが不可能な場合は、SQLサーバーがテーブル全体をローカルにロードしなければならないさまざまなことを調べる必要があります。たとえば、GETDATE()または特定の結合を使用します。その他のパフォーマンスキラーには、適切な権利を与えないことが含まれます。

詳細については、 http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ を参照してください。

166
NotMe
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

これはあなたを助けるかもしれません。

25
Akhilesh Kamate

それでも<server>.<database>.<schema>.<table>に問題がある場合

サーバー名を[]で囲みます

9
Mian

スキーマ/所有者(デフォルトではdbo)を参照の一部として指定する必要があります。また、新しい(ANSI-92)結合スタイルを使用することをお勧めします。

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name
8
Joe Stefanelli

これらの他の回答で問題がある場合は、 OPENQUERY を試してください

例:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 
8
Tom Stickel
select * from [Server].[database].[schema].[tablename] 

これが正しい呼び出し方法です。クエリを実行する前に、サーバーがリンクされていることを確認してください!

リンクサーバーの呼び出しを確認するには:

EXEC sys.sp_linkedservers 
5
select name from drsql01.test.dbo.employee
  • drslq01はservernmae --linked sererです
  • テストはデータベース名です
  • dboはスキーマ-デフォルトのスキーマです
  • 従業員はテーブル名です

リンクサーバーのクエリを実行する方法を理解するのに役立つことを願っています

3
Jaspreet Singh

通常、リンクサーバーの場合、SQLサーバーの一時データベースを頻繁に使用するため、直接クエリは使用しないでください。最初のステップでデータが一時DBに取得され、フィルタリングが行われます。これについては多くのスレッドがあります。 SQLをソースリンクサーバーに渡し、フィルター処理された結果を返すため、open OPENQUERYを使用することをお勧めします。

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
2
Muhammad Yaseen

それが価値があるものについては、私は次の構文が最適に機能することを発見しました:

SELECT * FROM [LINKED_SERVER] ... [TABLE]

データベース名を使用して、他のユーザーの推奨事項を得ることができませんでした。また、このデータソースにはスキーマがありません。

2
Sean Warren

テーブルを右クリックし、選択としてスクリプトテーブルをクリックします

enter image description here

2
Shimon Doodkin

次のクエリが最適です。

このクエリを試してください:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

MySQLをMS SQLにリンクすると非常に役立ちます

1
Vijay S