SQL Server (T-SQL) - Autokalkulowane kolumny, ich utrwalanie i łączenie z UDF
Gdy robimy autokalkulowaną kolumnę w tabeli, możemy zechcieć by była ona utrwalana w pamięci bazy danych. Podejście takie może jednak zrodzić problem, gdy zawartość tej kolumny determinowana jest przy pomocy UDF (User Definied Function). W tym wpisie chciałbym pokazać, jak pogodzić ze sobą te dwie możliwości.
Czym są kolumny automatycznie obliczane?
Odpowiedzi na to pytanie nie trudno się pewnie domyślić. Oczywiście chodzi o sytuację, w której wartość pewnej kolumny zostaje w sposób automatyczny wyznaczona, na podstawie wartości innych kolumn. Myślę, że najprostszym przykładem może być kolumna, która zwraca sumę wartości dwóch innych kolumn.
O co chodzi z utrwalaniem danych z autokalkulowanej kolumny?
Bazując wciąż na przykładzie przedstawionym wyżej, z każdym razem wykonując kwerendę mającą na celu pobranie z tabeli wartości kolumny LiczbaTowarow, będzie ona wyliczana na nowo, a zatem nie będzie ona fizycznie utrwalona w pamięci bazy danych. Tak jednak być nie musi. Szukając optymalnej relacji pomiędzy rozmiarem bazy danych, a czasem wykonywania zapytań, możemy zechcieć, by wartość danej automatycznie wyliczanej kolumny, była utrwalana w sposób fizyczny. Wtedy nie będzie ona wyliczana na nowo podczas pobierania tych danych, a nastąpi to jedynie wtedy, gdy wprowadzimy zmiany do kolumn składowych (w naszym wypadku: LiczbaOwocow, LiczbaWarzyw). Chcąc tego dokonać, powinniśmy do wcześniejszej komendy, dołączyć dyrektywę PERSISTED:
A co jeśli chcemy ustalać wartość kolumny przy pomocy UDF?
Nasz przykład jest bardzo prosty, dlatego mogliśmy sobie pozwolić na podanie formuły kalkulacji explicite już w komendzie dodającej daną kolumnę. Czasem jednak, w bardziej złożonych sytuacjach, wygodniej jest napisać funkcję, która pobierze odpowiednie wartości i zwróci pożądany rezultat. Jest to dobre rozwiązanie, gdy chcemy na przykład, by kilka kolumn ustalanych było przy pomocy tej samej procedury. Zakładając, że mamy funkcję sumujWartosci() przyjmującą dwa argumenty liczbowe i zwracającą ich sumę (na razie załóżmy, że już istnieje - zdefiniujemy ją w kolejnych akapitach), komenda dodająca automatycznie wyliczaną kolumnę, może wyglądać tak:
Co jeśli operujemy na kolumnach jednaj tabeli, a jest problem z jej utrwaleniem?
Zdarzyć się może, że pomimo działania funkcji w obrębie jednej tabeli, nie będzie mogła być ona utrwalona, ponieważ jej wartość nie będzie mogła być ustalona, co zwieńczy komunikat błędu o treści:(
@skladnik1 INT,
@skladnik2 INT
)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
RETURN @skladnik1 + @skladnik2
END
Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!