Uruchamianie procesu gotowego SAS w .NET

Zadanie: uruchomić proces gotowy SAS w ramach własnego programu w C#. Z dokumentacji wynika, że możemy wykorzystać StoredProcessService (patrz plik sas.chm w katalogu z instalacją SAS Integration Technologies*). Mamy dostępne dwie metody: Execute i ExecuteWithResults (która zwraca także wynik działania procesu). Parametrami wywołania są nazwa procesu gotowego w ramach repozytorium oraz oddzielana spacjami lista parametrów procesu z ich wartościami.

Tylko co to jest to repozytorium i jak je znaleźć?
Czytaj dalej

SQL w SAS – ograniczanie listy obserwacji

Jednym ze sposobów uruchomienia kodu SQL w SAS jest wykonanie PROC SQL. Np.

proc sql;
SELECT *
FROM SASHELP.CLASS
;
quit;

W celu ograniczenia liczby przetwarzanych lub wyświetlanych rekordów możemy zastosować opcje PROC SQL. I tak:

  • INOBS mówi ile obserwacji z każdego zbioru wymienionego w SQL należy wziąć do przetwarzania (odpowiednik TOP/LIMIT użytego w podzapytaniu)
  • OUTOBS mówi ile obserwacji pokazać na koniec przetwarzania (odpowiednik TOP/LIMIT w głównym zapytaniu)

Tak pobierzemy trzy wiersze ze zbioru wynikowego:

proc sql outobs=3;
SELECT *
FROM SASHELP.CLASS
;
quit;

Wszystko fajnie, tylko co jeśli nie chcemy albo nie możemy używać opcji PROC SQL (bo np. piszemy własne oprogramowanie wykorzystując SAS Integration Technologies)? Wówczas mamy dwie możliwości, w zależności od skomplikowania zapytania.

W najprostszym przypadku, jeśli potrzebujemy odpowiednik „SELECT TOP 100 * FROM tabela” wystarczy dodać klauzulę OBS=100 po FROM – zadziała to tak samo jak INOBS. Uwaga – jeśli stosujemy aliasy tabel, to klauzulę należy dodać przed nimi, np.

SELECT * FROM SASHELP.CLASS (OBS=100) sc

Jeśli potrzebujemy ograniczyć listę wynikową, to można ponumerować wiersze za pomocą nieudokumentowanej funkcji MONOTONIC() (której na dodatek SAS nie wspiera)

SELECT * FROM SASHELP.CLASS sc WHERE MONOTONIC() <= 3

Jeśli łączymy się do zbiorów w zewnętrznych bazach danych możemy też zastosować mechanizm SQL Pass-through. Dzięki niemu możemy wykorzystać dialekt SQL wykorzystywany w danym środowisku, a dodatkowo zrzucimy przetwarzanie na bazę danych, a nie na SAS. Więcej o SQL Passthrough np. tutaj lub tutaj.

Przeglądanie metadanych SAS używając C#

Do przeglądania metadanych SAS potrzebne będą:

  • dostęp do serwera metadanych SAS
  • posiadanie SAS Integration Technologies (instalują się np.  razem z Enterprise Guide (dalej: EG), ale można też pobrać oddzielnie)
  • jakieś środowisko do pisania kodu w C# (użyłem Visual C# 2008 Express)

Zasady komunikacji z serwerem metadanych opisano w dokumentacji Open Metadata Interface (PDF dla wersji 9.2. np. tu: http://support.sas.com/documentation/cdl/en/omaref/59983/PDF/default/omaref.pdf). Zanim przejdziemy do .NET – jak to wygląda w samym SASie.

Poniższy kod wpisany w EG  pobiera listę dostępnych repozytoriów (przy założeniu, że połączyliśmy się już do serwera metadanych – nie musimy podawać parametrów uwierzytelnienia):

proc metadata
    in='<GetRepositories>
    <Type>Repository</Type>
    </GetRepositories>';
run;

Wystarczy, że podamy odpowiednio przygotowany kod XML na wejściu i otrzymujemy odpowiedź XML z serwera na wyjściu. Przykładowa odpowiedź:

<GetRepositories>
  <Type>Repository</Type>
  <Repositories>
    <Repository Id="A0000001.R0000001" Name="Foundation" Desc="" DefaultNS="SAS"/>
    <Repository Id="A0000001.R0000002" Name="BILineage" Desc="BILineage" DefaultNS="SAS"/>
  </Repositories>
</GetRepositories>

Jak podobny efekt uzyskać we własnej aplikacji na przykładzie C#?
Czytaj dalej