Ostrzeżenie: ten wpis dotyczy języka zapytań SQL. Jeżeli nie znasz SQL-a, lektura tego wpisu będzie dla Ciebie tak samo fascynująca jak czytanie wspak chińskiego przekładu "Baśni z tysiąca i jednej nocy".
Pisałem jakiś czas temu o programie SQL Prompt firmy RedGate. Wspomniałem tam o możliwości pisania własnych snippetów - dziś wrzucę na ruszt listę snippetów mojego autorstwa, z których korzystam na co dzień, i które skracają mi czas pisania kodu SQL niemal o rząd wielkości.
Zaskakujące jest to, że nie ma tego zbyt wiele - prawda jest bowiem taka, że większośc kodu SQL to powielane schematy i naprawdę trudno wymyśleć coś nowego. Jak by się człowiek mocno postarał, jest w stanie zakodować prawie dowolną logikę biznesową za pomocą instrukcji czterech typów (SELECT, UPDATE, INSERT, DELETE), a cała reszta to rzeczy używane w może pięciu procentach kodu (co nie znaczy, że mniej ważne - po prostu rzadziej używane).
OK, zaczynamy.
CVC: CONVERT(VARCHAR,
Czasem musimy wysłać jakąś informację do logu. Log na ogół łyka informacje tekstowe. Szybka konwersja czegokolwiek na tekst jest bardzo przydatna, tym bardziej, że klawisze "C" i "V" są po sąsiedzku.
GB: GROUP BY
Maleństwo, ale gdy piszemy dużo zapytań agregujących, zaskakująco przydatne maleństwo.
INN: IS NOT NULL
Również niewielki ale bardzo poręczny snippet.
NL: WITH ( NOLOCK )
Wysyłając zapytania ad-hoc do serwera produkcyjnego (zakładając, że w ogóle mamy do niego dostęp!), często zapominamy dodać tą opcję do każdej tabeli, dzięki czemu możemy w łatwy sposób doprowadzić serwer do czkawki. Oczywiście można zamiast tego na początku dać SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED i problem z głowy.
STILRU: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Patrz komentarz powyżej.
OB: ORDER BY
Wbrew pozorom bardzo przydatna pchełka.
OID: OBJECT_NAME([object_id])
Do wyłuskania nazwy tabeli / procedury na podstawie jej identyfikatora. Przydaje się od czasu do czasu przy zapytaniach do metadanych.
OM4: OPTION (MAXDOP 4)
Święty Graal wszystkich zapytań ad-hoc do serwerów produkcyjnych. czwórkę trzeba oczywiście zastąpić czymś adekwatym do naszego środowiska. Wyobraźmy sobie, że przez pomyłkę wysyłamy zapytanie SELECT * from T, T, gdzie T jest tabelą z setką miliardów rekordów. Serwer kucnie od razu. A jak zrobimy SELECT * FROM T, T OPTION (MAXDOP 4), możemy dziada ubić bez większego stresu, a reszta zapytań wykonujących się w tym samym czasie pójdzie bezboleśnie.
SSO: SELECT * FROM sys.objects WITH ( NOLOCK ) WHERE [name] LIKE '%$CURSOR$%'
Przydatne do wyszukania obiektu, którego fragment nazwy pamiętamy.
UAS: UNION ALL SELECT
Jeżeli często piszemy zapytania typu UNION, bardzo przydatne.
STH: SELECT TOP 100 * FROM
Do wybrania próbki rekordów z tabeli.
I teraz najważniejsze: żaden z powyższych snippetów sam w sobie nie jest jakąś rewolucją. Jednak gdy piszemy dużo kodu SQL, opanowanie i używanie wszystkich tych skrótów naprawdę znakomicie skraca czas potrzebny na napisanie zapytania.
Przykład:
Chcemy sprawdzić jakie z grubsza dane (kolumny, próbka danych i tak dalej) siedzą w tabeli X na serwerze produkcyjnym. Zapytanie wygląda mniej więcej tak:
SELECT TOP 100 * FROM X WITH (NOLOCK) ORDER BY order_date OPTION (MAXDOP 4)
Zobaczmy teraz jak to wygląda "na dopalaczach"
sth<tab>X<spacja>NL<tab>OB<tab>order_date<spacja>OM4<tab>
Zapytanie bez "dopalaczy" wymaga naciśnięcia 75 klawiczy. Identyczne zapytanie "na dopalaczach" to zaledwie 27 klawiszy, z czego 6 to spacje bądź tabulatory.
Inny przykład:
Chcemy znaleźć wszystkie obiekty w bazie, które mają w nazwie słowo "customer". Zapytanie wygląda - mniej więcej - o tak:
SELECT * FROM sys.objects WITH ( NOLOCK ) WHERE name LIKE '%customer%' OPTION ( MAXDOP 4 )
Mając do dyspozycji snippet SSO, piszemy:
SSO<tab>customer
Z 91 klawiszy zeszliśmy do 12.
Oczywiście wszystko zależy od tego jak często szukamy obiektów po fragmencie ich nazwy, ale chodzi o pokazanie ogólnej zasady.
Jak już nadmieniłem, przedstawionych tutaj snippetów nie znajdzie się w standardowej instalacji SQL Prompt i trzeba je sobie dopisać samemu. Gorąco zachęcam do eksperymentowania i tworzenia własnych snippetów - każdy programista ma swój styl i może potrzebować czegoś innego. Ciekawe snippety proszę zamieszczać w komentarzach - może inni skorzystają.
Dziś zamiast kawału coś z kulinariów. Przepis Jacka Sawaszkiewicza na katrzany po grenghalsku:
Dorosłego dojonia upolować przed zapadnięciem zmroku i odłożyć do lodówki na dobę. Następnie zedrzeć z niego powłokę zewnętrzną i wypatroszyć. Ostrożnie, by nie uszkodzić chrąszczy i speletu, wyłuskać katrzany, wydłutować z obu pładni, przykrąpić, pogrępolić i wydrypić.
Nie uszkodzone chrąszcze i spelet posiekać, doprawić. Zagotować w piętnastoprocentowej solance, dodać sto gramów borugdu. Wcholastowić, zamusklać i roztorbolić z wydrypionymi uprzednio katrzanami. Polać strumplem ertolskim.
Smacznego!
Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]
Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.