2009-01-30 11 views
20

Dodałem połączony serwer, który jest wyświetlany na liście połączonych serwerów, ale gdy go odpytuję, zgłasza błąd z nazwą serwera bazy danych.Wywoływanie połączonego serwera sql

EXEC sp_helpserver 
EXEC sp_addlinkedserver 'aa-db-dev01' 
Select * from openquery('aa-db-dev01','Select * from TestDB.dbo.users') 

Msg 102, Level 15, State 1, wiersz 1
Niepoprawna składnia w pobliżu 'aa-db-dev01'.

Odpowiedz

30
SELECT * FROM [server].[database].[schema].[table] 

Działa to dla mnie. Firma SSMS intellisense może nadal podkreślać to jako błąd składni, ale powinna działać, jeśli połączony serwer jest skonfigurowany, a zapytanie jest poprawne.

+0

z badań robiłem, natomiast 4part nazewnictwo działa, to kończy się wolniej niż przy użyciu OPENQUERY. –

+0

Również to podejście nie zadziała, jeśli definicja tabeli zawiera typy kolumn "xml". – Lankymart

+0

@ Hack-R jest zarejestrowany jako serwer połączony? –

22

Musisz usunąć cudzysłowy z nazwy połączonego serwera. Powinno być tak:

select * from OPENQUERY (aa-db-dev01 'select * from TestDB.dbo.users')

+0

Tracisz intellisense w ten sposób, więc idź w drugą stronę, jeśli możesz z punktu widzenia rozwoju, ale musisz użyć tego w ten sposób, jeśli dostawca nie ujawnia katalogu lub schemat. –

+0

Ta opcja przewiduje ograniczenie liczby znaków do 8 000 znaków. Nadal próbuję znaleźć obejście tego problemu. 'exec (@Query) w LinkedServerName' wydaje się być dla tego typu obejściem, ale nie mogę dołączyć do wyniku z innymi tabelami. Próbowałem użyć stołów tymczasowych bez szczęścia. –

5

Można użyć:

SELECT * FROM [aa-db-dev01].[TestDB].[dbo].[users]; 
+0

To NIE DZIAŁA, a niektóre serwery połączone z serwerem SQL, powodując ... Nieprawidłowy schemat lub katalog został określony dla dostawcy "MSDASQL" dla połączonego serwera "MyLinkedServer". – brewmanz

1

try Select * from openquery("aa-db-dev01",'Select * from users'), połączenie z bazą danych powinny być określone w łączył konfigurację serwera

1

używać otwartego zapytanie do wykonania tego zadania tak:

select top 1 * 
INTO [DATABASE_TO_INSERT_INTO].[dbo].[TABLE_TO_SELECT_INTO] 
from openquery(
    [LINKED_SERVER_NAME], 
    'select * from [DATABASE_ON_LINKED_SERVER].[dbo].[TABLE_TO_SELECT_FROM]' 
) 

Powyższy przykład wykorzystuje zapytanie otwarte do wybrania danych z bazy danych na podłączonym serwerze do wybranej przez siebie bazy danych.

Uwaga: Dla kompletności odniesienia, można wykonać proste wybrać tak:

select top 1 * from openquery(
    [LINKED_SERVER_NAME], 
    'select * from [DATABASE_ON_LINKED_SERVER].[dbo].[TABLE_TO_SELECT_FROM]' 
) 
Powiązane problemy