Linked Server są obiektami nie dotyczącymi wprost określonej bazy danych (choć baza danych lokalna lub zdalna może być źródłem) - dotyczą danej instalacji SQL Server. Są obiektami, których zadaniem jest podłączanie przy wykorzystaniu odpowiednich sterowników zewnętrznych źródeł danych: po tej operacji umożliwiając zadawanie zapytań w języku SQL w ramach danego SQL Server. Innymi słowy - umożliwiają nam integrację danych pochodzących z różnych źródeł w ramach jednego serwera SQL. Jeśli by szukać podobieństw, to są one zbliżone do "tabel połączonych" programu MS Access - pełniąc podobną rolę.
W sytuacji kiedy nie mamy podłączonego żadnego źródła danych na drzewie obiektów widzimy jedynie dostępne sterowniki, określające jakiego typu dane zewnętrzne możemy wykorzystać:
Aby sprawdzić działanie "Linked Server" podłączymy przykładowy zestaw danych kolejno z pliku tekstowego, MS Excel i MS Access. Na początek plik w formacie txt, zapisany na dysku D lokalnego komputera:
Tak naprawdę jako źródło danych podłączyliśmy cały folder. Dzięki temu będziemy mogli wykorzystać w zapytaniach wszystkie pliki tekstowe, które zawierają dane ułożone w kolumnach oddzielone przecinkiem, przy czym w pierwszym wierszu zawarte są nagłówki (nazwy kolumn). Zwróćmy uwagę na parametry podane podczas definiowania źródła:
- Linked Server - nazwa pod jaką zapiszemy podłączane źródło danych
- Server Type - wybieramy "Other data source", gdyż nie zamierzamy podłączać kolejnego SQL Server
- Provider - sterownik, jaki będzie użyty do komunikacji serwera ze źródłem danych - wybieramy go z listy. MS Jet jest standardowym sterownikiem Microsoft dla obsługi plików pakietu Office (Excel, Access) oraz właśnie plików tekstowych.
- Product name - w przypadku plików tekstowych, podajemy po prostu przyjazną dla nas nazwę w tym miejscu
- Data source - ścieżka do folderu, który ma być źródłem danych (u nas dysk D).
- Provider string - dla plików tekstowych wpisujemy "TEXT".
Pozostałe elementy pozostają niewypełnione (przy wybranym sterowniku i tak są niedostępne).
Po podaniu powyższych danych, klikamy przycisk OK i na drzewie obiektów pojawia się nowy:
Zauważmy, że obiekt ten (mimo, że umożliwia zadawanie podobnych zapytań jak tabela) posiada menu kontekstowe, to nie działa w jego przypadku generator zapytań tak jak dla tabel. Dostępne są jedynie polecenia CREATE i DROP - czyli utwórz i usuń. Zobaczmy jak wygląda skrypt wygenerowany przez to pierwsze:
Utworzenie "Linked Server" jest tak naprawdę uruchomieniem kilkunastu systemowych procedur składowanych wraz z podaniem odpowiednich parametrów dla każdej z nich. Pierwsza - "sp_addlinkedserver" dodaje źródło danych, wszystkie pozostałe ustawiają jego właściwości - użyta jest wielokrotnie procedura "sp_serveroption" z parametrami określającymi nazwę "linked servera", nazwy opcji oraz jej ustawienia. Niektóre opcje mamy też dostępne w oknie graficznym, które uruchamiamy przy użyciu polecenia Properties menu kontekstowego:
Co do zasady, w większości przypadków nie ma potrzeby zmieniania domyślnych ustawień źródła danych. Gdyby jednak zaszła taka konieczność, to warto wspomnieć, iż ustawiona na "True" opcja Data Access" umożliwia zadawanie zapytań do źródła z różnorodnych zewnętrznych programów, które będą łączyć się z naszą instancją SQL Server, natomiast opcje connect timeout oraz query time out określają jak długo serwer może czekać na połączenie ze źródłem danych lub na wykonanie kwerendy. Opcji jest o wiele więcej (w przypadku różnych sterowników, dochodzą kolejne), jednak nie będziemy ich szczegółowo omawiać ze względu na fakt, iż standardowe ustawienia są zazwyczaj wystarczające dla podstawowego zestawu sterowników zainstalowanego z serwerem, natomiast w przypadku nietypowych sytuacji (wykorzystania sterowników dostarczonych z zewnętrznym oprogramowaniem) należy i tak sięgnąć do instrukcji producenta określonego programu, ponieważ to on definiuje optymalne i/lub specyficzne ustawienia.
Zobaczmy teraz na użycie "Linked Server" w zapytaniu. Mamy dwie opcje:
W pierwszym przypadku odwołujemy się wprost do pliku poprzedzając go nazwą źródła danych - dodatkowo zamiast kropki przed rozszerzeniem pliku, musimy użyć znaku "#".
Jako, że sterownik tego typu nie przewiduje katalogów ani schematów w swojej konstrukcji, nazwa "Linked Server" jest oddzielona od pliku (który de facto pełni rolę tabeli) trzema kropkami. Gdybyśmy np. utworzyli połączenie z SQL Serverem (np. nawet lokalnym, na którym pracujemy):
w tym przypadku musimy zdefiniować też login i hasło do połączenia:
Wówczas zapytanie do takiego serwera zawiera więcej danych: nazwę źródła danych, bazę danych, schemat oraz na końcu tabelę:
Natomiast wracając do drugiej opcji uruchomienia, wiąże się ona z wykorzystaniem funkcji tablicowej OPENQUERY, która ma postać:
Przykład użycia jest pokazany powyżej. Obie możliwości, pomimo że różnią się konstrukcją polecenia w efekcie dają takie same wyniki.
Przejdźmy teraz do podłączenia kolejnych formatów pliku: MS Excel oraz MS Access. Najpierw Excel. Poza użyciem tego samego sterownika, co poprzednio, musimy podać pełną ścieżkę do danego pliku, gdyż funkcję tabeli będą teraz pełnić poszczególne nazwane obszary arkusza (użycie obszarów nazwanych arkuszy jest niezbędne dla wykorzystania pliku w tym formacie jako źródło danych). Przypomnijmy, że obszary nazywa się zaznaczając je i wpisując ich określenia w odpowiednim miejscu arkusza:
Po tym możemy zdefiniować "Linked Server":
Product name - podajemy "Excel", po nim w polu Data source pełną ścieżkę do pliku Excel, po czym w Provider string wpisujemy "Excel 8.0" - dla plików w formacie Excel 97 do Excel 2002 (z rozszerzeniem *.xls). Użycie potem źródła danych jest identyczne jak poprzednio, z tą różnicą, że na końcu podajemy nazwę obszaru nazwanego arkusza:
Ponownie działają obie opcje uruchomienia zapytania.
Trzeci przykład będzie dotyczył pliku w formacie MS Access. Podobnie jak w przypadku MS Excel podajemy pełną ścieżkę do pliku i ten sam sterownik:
Identycznie sprawa wygląda w przypadku zadawania zapytań, z tym że musimy pamiętać iż funkcję tabel pełnią teraz faktyczne tabele bazy danych MS Access:
Na zakończenie warto jeszcze wspomnieć o możliwości dodawania bazy MS Access jako "Linked Server" przy wykorzystaniu wbudowanej, systemowej procedury składowanej. Wykorzystać w tym celu można "Template Explorer" poznany na początku tego kursu, następnie uruchamiamy procedurę i wypełniamy odpowiednimi informacjami o lokalizacji pliku: