Prawdopodobnie powinien mieć format:
<server>.<database>.<schema>.<table>
Na przykład: DatabaseServer1.db1.dbo.table1
Aktualizacja : wiem, że to stare pytanie, a odpowiedź, którą mam, jest poprawna; jednak myślę, że każdy, kto się na to natknie, powinien wiedzieć kilka rzeczy.
Mianowicie, podczas wysyłania zapytań do serwera połączonego w sytuacji łączenia, CAŁA tabela z serwera połączonego zostanie prawdopodobnie pobrana na serwer, z którego zapytanie jest wykonywane w celu wykonania operacji łączenia. W przypadku OP, zarówno table1
z , jak DB1
i table1
z DB2
zostaną przesłane w całości do serwera wykonującego zapytanie, przypuszczalnie nazwanego DB3
.
Jeśli masz duże tabele, może to spowodować wykonanie operacji, której wykonanie zajmie dużo czasu. W końcu jest teraz ograniczony przez prędkości ruchu sieciowego, które są o rząd wielkości wolniejsze niż pamięć, a nawet prędkości transferu dysku.
Jeśli to możliwe, przeprowadź pojedyncze zapytanie względem serwera zdalnego, bez dołączania do tabeli lokalnej, aby pobrać potrzebne dane do tabeli tymczasowej. Następnie zapytaj o to.
Jeśli nie jest to możliwe, należy przyjrzeć się różnym rzeczom, które spowodowałyby, że serwer SQL musiałby lokalnie załadować całą tabelę. Na przykład użycie GETDATE()
lub nawet niektórych złączeń. Inni zabójcy wydajności obejmują nieprzyznawanie odpowiednich praw.
Więcej informacji można znaleźć pod adresem http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ .
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
To może ci pomóc.
źródło
Jeśli nadal masz problem z
<server>.<database>.<schema>.<table>
Umieść nazwę serwera w
[]
źródło
dbo.databaseserver1.db1.dbo.table1
Jeśli masz problem z innymi odpowiedziami , spróbuj
OPENQUERY
Przykład:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
źródło
Musisz określić schemat / właściciela (domyślnie dbo) jako część odniesienia. Zalecane byłoby również użycie nowszego stylu łączenia (ANSI-92).
select foo.id from databaseserver1.db1.dbo.table1 foo inner join databaseserver2.db1.dbo.table1 bar on foo.name = bar.name
źródło
select * from [Server].[database].[schema].[tablename]
To jest właściwy sposób dzwonienia. Przed wykonaniem zapytania sprawdź, czy serwery są połączone!
Aby sprawdzić połączone serwery, zadzwoń:
źródło
select name from drsql01.test.dbo.employee
Mam nadzieję, że pomoże to zrozumieć, jak wykonać zapytanie dla serwera połączonego
źródło
Zwykle zapytania bezpośrednie nie powinny być używane w przypadku serwera połączonego, ponieważ intensywnie korzysta on z tymczasowej bazy danych serwera SQL. W pierwszym kroku dane są pobierane do tymczasowej bazy danych, a następnie następuje filtrowanie. Wątków na ten temat jest wiele. Lepiej jest użyć otwartego OPENQUERY, ponieważ przekazuje on SQL do źródłowego serwera połączonego, a następnie zwraca przefiltrowane wyniki, np
SELECT * FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
źródło
Jeśli chodzi o to, co jest warte, stwierdziłem, że następująca składnia działa najlepiej:
WYBIERZ * FROM [LINKED_SERVER] ... [TABELA]
Nie mogłem uzyskać rekomendacji innych do pracy, używając nazwy bazy danych. Ponadto to źródło danych nie ma schematu.
źródło
kliknij prawym przyciskiem myszy tabelę i kliknij tabelę skryptów jako opcję wyboru
źródło
Podążanie za zapytaniem działa najlepiej.
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')
źródło
PostgreSQL :
Musisz pominąć DBName w zapytaniu :
SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')
źródło
Zrobiłem, aby znaleźć typ danych w tabeli na serwerze link_server za pomocą zapytania openquery i wyniki były pomyślne.
SELECT * FROM OPENQUERY (LINKSERVERNAME, ' SELECT DATA_TYPE, COLUMN_NAME FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''TABLENAME'' ')
To dla mnie praca
źródło