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


93

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

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

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

回答:


186

形式はおそらく次のようになります。

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

例:DatabaseServer1.db1.dbo.table1


更新:私はこれが古い質問であり、私が持っている答えが正しいことを知っています。しかし、これに出くわした他の誰もがいくつかのことを知っているはずだと思います。

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

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

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

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

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


11
データベース
サーバー

4
@ bmw0128:さらによいのは、二重引用符を使用することです。Microsoftの角括弧とは異なり、ほとんどすべてのプラットフォームでサポートされています。

2
また、データベースサーバー名にピリオドが含まれている場合は、角括弧または二重引用符を使用する必要があります。
David Brunow 2014年

4
修飾子について不明な点がある場合は、SSMSオブジェクトエクスプローラーでリンクサーバーのテーブルにドリルダウンし、右クリックして、[テーブルのスクリプト]、[SELECT To]、[新しいクエリエディター]ウィンドウの順にクリックします。結果のSELECTステートメントには、テーブルへの正しい完全修飾パスが含まれます。Sybaseを操作する際に謎のデータベース修飾子があり、これにより正しい名前が付けられました。
John Mo

テーブル全体が転送されるというのは間違いだと思います。その情報をどこで入手したかについての参考情報を提供できますか?リンクサーバーで2億400万行(16 GBのデータ、6.6 GBのインデックス)を含むテーブルに対して結合を試みたところ、データがおそらくキャッシュされているため、5行にリンクするのに47ミリ秒、2番目のクエリでは7ミリ秒かかりました。おそらく、結合でリンクテーブルのテーブルスキャンが必要な場合、すべてを転送する必要がありますか?
Jason Goemaat 2015

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

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


賛成。これは、MySQLをMS SQLにリンクするときに機能します。
Baz Guvenkaya 2017

3
つまり、これはパススルークエリを作成しています。クエリステートメントは、サーバーのネイティブSQLで記述する必要があることに注意してください。Oracleの構文は、SQL ServerのなどよりのTeradata異なるよりも異なっている
AxGryndr

10

それでも問題が見つかった場合 <server>.<database>.<schema>.<table>

サーバー名を []


注意:[]を使用してselectからcreate tableを実行しましたが、リンクサーバーで作成されるのではなく、テーブルは次のような名前でローカルに作成されましたdbo.databaseserver1.db1.dbo.table1
biscuit314


8

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

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

内部結合構文は暗黙的結合よりも望ましいですか?
bmw0128 2010年

2
@ bmw0128:はい、いくつかの理由があります。私見、最も重要なのは、テーブルと結合が2つの異なる場所にある場合に、クロスプロダクト結合を誤って作成するのは簡単すぎることです。

一部のSQL Server以外のリンクサーバーでは、4ドットの部分が機能しないことに注意してください。リンクサーバー "MyLinkedServer"のプロバイダー "MSDASQL"に無効なスキーマまたはカタログが指定されました。
brewmanz 2017年

6
select * from [Server].[database].[schema].[tablename] 

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

リンクサーバーを確認するには、次を呼び出します。

EXEC sys.sp_linkedservers 

これは、一部のSQL Server以外のリンクサーバーでは機能しません。次のようなエラーが発生します...リンクサーバー "MyLinkedServer"のプロバイダー "MSDASQL"に無効なスキーマまたはカタログが指定されました。
brewmanz 2017年

4
select name from drsql01.test.dbo.employee
  • drslq01はservernmae-リンクされたサーバーです
  • testはデータベース名です
  • dboはschema -defaultスキーマです
  • 従業員はテーブル名です

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


2

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

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

この回答にはデータベース名は含まれていません
Chris Nevill

2
リンクサーバーの作成中にデータベース情報を提供しました。詳細については、以下のMSDNリンクを参照してください
。msdn.microsoft.com/ en

リンクサーバーに認証が必要で、PDOを使用してPHPアプリケーションからクエリを実行しようとしている場合はどうすればよいですか?
nekiala 2017年

このアプローチを使用して、データベース1からリンクサーバー上のデータベースへの結合をどのように実行しますか?
eaglei22

2

価値があることについては、次の構文が最適に機能することがわかりました。

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

データベース名を使用して、他の人の推奨を機能させることができませんでした。さらに、このデータソースにはスキーマがありません。


2

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

ここに画像の説明を入力してください


それはOPが尋ねたことではありません
Fandango68

2
これは、リンクテーブルで選択クエリの正しい構文を取得する方法を示しています。結果はショーンズアンサーのようなものです
Shimon Doodkin

1
@ShimonDoodkin、私に魚を与えないが、釣り方を教えてくれる素晴らしい例
Amro

0

次のクエリが最も効果的です。

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

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

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


0

PostgreSQL

  1. データソースDSNにデータベース名を指定する必要があります
  2. 管理としてManagement Studioを実行する
  3. クエリからDBNameを省略する必要があります

    SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.