W SQL Server możliwa jest aktualizacja danych za pomocą funkcji z wartościami tabelarycznymi.
Mam na myśli to, że możesz aktualizować dane w bazowych tabelach, do których wysyła zapytanie.
Na przykład, jeśli twoja funkcja zwraca czyjeś imię z tabeli, możesz zaktualizować jego imię, uruchamiając UPDATE
oświadczenie przeciwko funkcji zamiast tabeli.
Należy zauważyć, że działa to tylko w przypadku wbudowanych funkcji z wartościami przechowywanymi w tabeli (ITVF). O ile mi wiadomo, nie będzie działać na wieloinstrukcyjnych funkcjach z wartościami tabelarycznymi (MSTVF).
Ponadto aktualizowane kolumny muszą być prawidłowymi kolumnami w zapytaniu funkcji.
Przykład 1 – Przykładowa funkcja
Oto szybka funkcja, która wybiera podstawowe dane z tabeli.
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255)) RETURNS TABLE AS RETURN ( SELECT Score FROM dbo.Scoreboard WHERE Player = @Player ); GO
Ta funkcja po prostu wybiera wynik dla danego gracza.
Mógłbym użyć tej funkcji, aby zaktualizować wynik gracza.
Zdaję sobie sprawę, że zwykle zwracasz więcej niż jedną kolumnę, gdy używasz funkcji o wartościach z tabeli, ale chcę, aby ten przykład był prosty w celach demonstracyjnych.
Przykład 2 – Aktualizacja danych za pomocą funkcji
Oto przykład aktualizacji wyniku gracza.
Najpierw zobaczmy, jaki jest obecny wynik tego gracza.
SELECT * FROM udf_GetScore_ITVF('Homer');
Wynik:
+---------+ | Score | |---------| | 1 | +---------+
Więc Homer ma wynik 1.
Użyjmy funkcji wartości tabeli, aby ją zwiększyć.
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999; SELECT * FROM udf_GetScore_ITVF('Homer');
Wynik:
+---------+ | Score | |---------| | 99999 | +---------+
Więc udało mi się zwiększyć wynik Homera za pomocą wbudowanej funkcji z wartościami w tabeli.
Przykład 3 – kiedy to nie zadziała
Rzeczywiste kolumny, które możesz zaktualizować, będą zależeć od kolumn wybranych w zapytaniu. Moje zapytanie wybiera tylko Score
kolumna, więc mogę aktualizować tylko dane w tej kolumnie.
Oto, co się stanie, jeśli spróbuję zaktualizować dane w innej kolumnie.
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';
Wynik:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'Player'.
Wiemy, że stół ma Player
kolumna (ponieważ jest w WHERE
klauzula funkcji). Nie jest ona jednak zaznaczona w zapytaniu i dlatego nie jest prawidłową kolumną do zaktualizowania.