W
jednym z poprzednich postów napisałem, że SQL Server 2005 teoretycznie ignoruje klauzulę sortującą zawartą w definicji widoku, a jedynym prawidłowym i zalecanym miejscem na jej definiowanie jest zewnętrzny SELECT z widoku. Jak można się domyślić, istnieją sposoby na enkapsulowanie kolejności wierszy w samym obiekcie view - są to jednak tylko efekty uboczne innych operacji. Opiszę dwa z nich:
1. TOP X PERCENT ... ORDER BY kolumna
W wersji SQL Server 2000 efekt sortowania dawała taka konstrukcja:
CREATE VIEW widok AS
SELECT TOP 100 PERCENT *
FROM tabela
ORDER BY kolumna;
W wersji SQL Server 2005 powyższa definicja sortowania nie wywoła. Wydaje się, że programiści Yukonu celowo zablokowali efekt sortujący tego dość popularnego sposobu. Wystarczy jednak zamienić TOP 100 na np. TOP 99.999(..), aby wynikowy recordset znowu był posortowany. Rozwiązanie takie ma pewną wadę: może nie zwrócić wszystkich wierszy. Ze względu na ograniczenie precyzji typu numeric do 38 pozycji, największą liczbą w klauzuli TOP jest:
SELECT TOP (99.999999999999999999999999999999999999) ...
co jednocześnie determinuje maksymalną ilość wierszy wyświetlanych w widoku teoretycznie do liczby 10^38 rekordów. Praktycznie jednak liczba ta jest znacznie mniejsza, więc przy dużych tabelach raczej nie można polegać na takim rozwiązaniu.
2. ROW_NUMBER() OVER (ORDER BY col)
Poniższy kod:
CREATE VIEW widok AS
SELECT kol1, kol2, ..., ROW_NUMBER() OVER (ORDER BY kolX) as kol_sort
FROM tabela;
również sprawi, że utworzony widok będzie posortowany. Powodem tego efektu (ubocznego) jest oczywiście zastosowanie funkcji partycjonującej do stworzenia jednej z kolumn. Funkcja partycjonująca określa porządek rekordów, którym funkcja rankingowa ROW_NUMBER() przyporządkowuje odpowiednie wartości - w sposób naturalny następuje więc sortowanie. Co oczywiste, SQL Server po wykonaniu powyższej operacji nie aplikuje już randomizacji kolejności rekordów, zwracane są więc one w porządku narzuconym podczas generowania rezultatu. Rozwiązanie takie ma pewną wadę: kolumna
kol_sort musi występować wśród kolumn odczytywanych z widoku (oczywiście może to odbywać się w sposób niejawny - przez "gwiazdkę") - inaczej SQL Server zaniecha sortowania.
Każde z rozwiązań "sortowania na siłę" ma dość poważne wady, należy więc stosować je w ostateczności, a we wszystkich możliwych sytuacjach sortowanie narzucać w zewnętrznym zapytaniu z widoku. Należy też pamiętać, że opisane wyżej zachowania mogą być zmienione bez ostrzeżenia np. przez service pack.