sql >> Databáze >  >> RDS >> Sqlserver

Aktualizujte data pomocí funkce s hodnotou tabulky v SQL Server

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.


  1. Jak mohu odstranit duplicitní řádky?

  2. Porovnání poskytovatelů kompatibilních s Entity Framework pro Oracle?

  3. Vypočítejte pracovní dobu mezi dvěma daty

  4. Dotaz typu Rails typu dat Postgres JSON