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.

Reklamy

SQL Server XML i zamykanie znaczników

Co zrobić, jeśli chcemy wymusić, aby SQL Server przetwarzał w XSLT dane XML w postaci np.<imie="Bartek"></imie> zamiast tak jak to jest w rzeczywistości: <imie="Bartek" />?

Z jednej strony może i niewielki problem, ale przy próbie wygenerowania HTMLa będzie to powodowało błędy w takim przypadku:

chcemy poprawnie: <script type="text/javascript" src="jquery.js"></script>,
dostajemy niepoprawnie: <script type="text/javascript" src="jquery.js" />.

Obejście znalezione na StackOverflow: można dodać komentarz między znaczniki script. Przykład (fragment większego kodu przetwarzającego, akurat ten tworzy sekcję HEAD):

SET @sXSL = N'<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

<xsl:template match = "/element">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
    <title>Tytul</title>
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
    <link href="http://fonts.googleapis.com/css?family=Monda:400,700&amp;subset=latin,latin-ext" rel="stylesheet" type="text/css" />
    <style type="text/css">
        body, p, div, ul li, td, th {font-family : "Titillium Web", sans-serif; font-size : 11pt; font-weight : normal}
        th {text-align : left;}
        th.center {text-align : center;}
    </style>
    <script src="http://code.jquery.com/jquery-1.9.1.js"><xsl:comment> </xsl:comment></script>
    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"><xsl:comment> </xsl:comment></script>
</head>
</xsl:template>
</xsl:stylesheet>';

W wyniku otrzymujemy fragment:

<script src="http://code.jquery.com/jquery-1.9.1.js">
<!---->
</script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js">
<!---->
</script>

Samo przetwarzanie XSLT w SQL Server to odrębny wpis – ogólnie rzecz biorąc obsługa jest przez kod napisany w C# i dołączony jako zewnętrzna biblioteka przez polecenia CREATE ASSEMBLY.