Pomysł na ten artykuł zrodził się z problemu używania dosyć skomplikowanego widoku z MS SQL Server jako źródła do wypełnienia korespondencji seryjnej w MS Word. Oczywiście można to zrobić w samym Wordzie (dla zainteresowanych artykuł z pomocy microsoft’u), ale przy pliku z ponad 3000 etykiet adresowych wolałem nie ryzykować zabawy i oczekiwania na zmiany w edytorze tekstu.
Trik ten nie jest zalecany do standardowego użycia w view’sach, na których opiera się aplikacja. Możemy go jednak użyć, jeśli pewni, że dany view’s nie będzie wykorzystywany do wyliczeń w innym miejscu, ponieważ znacznie opóźni się szybkość jego wykonania. Drugim warunkiem jest znana liczba rekordów, które uzyskamy, a dokładniej liczba, od której ilość rekordów będzie mniejsza bądź równa.
Zacznijmy od tego, że samo użycie składni ORDER BY na końcu view’sa jest traktowane jako niemożliwe lub zabronione. Zapewne ze względu na to, że sama próba stworzenia takiego widoku kończy się komunikatem błędu:
Msg 1033, Level 15, State 1, Line 14 Klauzula ORDER BY jest nieprawidłowa w widokach, funkcjach wbudowanych, tabelach pochodnych, podzapytaniach i wspólnych wyrażeniach tabel, chyba że zostanie również użyta klauzula TOP, OFFSET lub FOR XML.
Komunikat ten daje nam już podpowiedź jak możemy ominąć obostrzenia silnika bazy danych. Dziś chciałbym zająć się tylko pierwszą wymienioną klauzulą, jednak nie wykluczam, że w niedalekiej przyszłości przetestuję i opiszę działanie pozostałych.
Dawniej działało użycie SELECT TOP 100 PERCENT z klauzulą ORDER BY na końcu view’sa. Składnia ta nie jest już wspierana, a raczej została usunięta, żeby nie rodzić błędów. Pewnym jest, że nawet, gdy była możliwa do wykonania nie gwarantowała posortowania wyniku. Sytuacja ta tyczy się szczególnie tabel, gdzie zastosowano index’y.
Jedyną działającą i sprawdzoną przeze mnie metodą jest użycie ORDER BY z ograniczeniem wyników do dokładnej liczby np. SELECT TOP 100. Można równie dobrze zapisać SELECT TOP (9223372036854775807).
Pomimo tego, że zrobiłem sporo doświadczeń na różnych zbiorach danych, nie mogę zagwarantować, że metoda zawsze zadziała lub nie zostanie wycofana w kolejnych edycjach MS SQL SERVER. Jako, że z definicji view’s jest nieuporządkowanym zbiorem danych dla wskazanych kryteriów, nie należy zbytnio ufać w doskonałość tej metody.
Pozostawiam Wam dalszą eksplorację tej ciekawostki i chętnie dowiem się w jakich wypadkach metoda ta nie działa, ponieważ jeszcze takich nie znalazłem.