V SQL Serveru je možné aktualizovat data pomocí funkce s hodnotou tabulky.
Mám na mysli to, že můžete aktualizovat data v podkladových tabulkách, na které se funkce dotazuje.
Pokud například vaše funkce vrací křestní jméno někoho z tabulky, můžete jeho křestní jméno aktualizovat spuštěním příkazu UPDATE
příkaz proti funkci namísto tabulky.
Všimněte si, že to funguje pouze u funkcí s hodnotou vložené tabulky (ITVF). Pokud je mi známo, nebude fungovat na vícepříkazových tabulkových funkcích (MSTVF).
Sloupce, které aktualizujete, také musí být platnými sloupci v dotazu funkce.
Příklad 1 – Ukázková funkce
Zde je rychlá funkce, která vybírá základní data z tabulky.
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255)) RETURNS TABLE AS RETURN ( SELECT Score FROM dbo.Scoreboard WHERE Player = @Player ); GO
Tato funkce jednoduše vybere skóre pro daného hráče.
Tuto funkci bych mohl použít k aktualizaci skóre hráče.
Uvědomuji si, že při použití funkce s tabulkovou hodnotou obvykle vrátíte více než jeden sloupec, ale tento příklad chci zachovat jednoduchý pro účely demonstrace.
Příklad 2 – Aktualizace dat pomocí funkce
Zde je příklad aktualizace skóre hráče.
Nejprve se podívejme, jaké je aktuální skóre tohoto hráče.
SELECT * FROM udf_GetScore_ITVF('Homer');
Výsledek:
+---------+ | Score | |---------| | 1 | +---------+
Homer má tedy skóre 1.
K jeho zvýšení použijeme tabulkovou funkci.
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999; SELECT * FROM udf_GetScore_ITVF('Homer');
Výsledek:
+---------+ | Score | |---------| | 99999 | +---------+
Takže jsem úspěšně zvýšil Homerovo skóre pomocí funkce vložené tabulky s hodnotou.
Příklad 3 – Když to nebude fungovat
Skutečné sloupce, které budete moci aktualizovat, budou záviset na sloupcích vybraných v dotazu. Můj dotaz vybírá pouze Score
sloupec, takže mohu aktualizovat pouze data v tomto sloupci.
Zde je to, co se stane, když se pokusím aktualizovat data v jiném sloupci.
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';
Výsledek:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'Player'.
Víme, že stůl má Player
(protože je v WHERE
klauzule funkce). Není však vybrán v dotazu, a proto není platným sloupcem k aktualizaci.