I SQL Server är det möjligt att uppdatera data via en tabellvärderad funktion.
Vad jag menar är att du kan uppdatera data i de underliggande tabellerna som funktionen frågar efter.
Till exempel, om din funktion returnerar någons förnamn från en tabell kan du uppdatera deras förnamn genom att köra en UPDATE
uttalande mot funktionen istället för tabellen.
Observera att detta bara fungerar på inline-tabellvärderade funktioner (ITVF). Så vitt jag är medveten om fungerar det inte på multi-statement table-valued functions (MSTVF).
Dessutom måste kolumnerna du uppdaterar vara giltiga kolumner i funktionens fråga.
Exempel 1 – Exempelfunktion
Här är en snabbfunktion som väljer grundläggande data från en tabell.
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255)) RETURNS TABLE AS RETURN ( SELECT Score FROM dbo.Scoreboard WHERE Player = @Player ); GO
Denna funktion väljer helt enkelt poängen för en given spelare.
Jag skulle kunna använda den här funktionen för att uppdatera en spelares poäng.
Jag inser att du vanligtvis returnerar mer än en kolumn när du använder en tabellvärderad funktion, men jag vill hålla det här exemplet enkelt för demonstrationsändamål.
Exempel 2 – Uppdatera data via funktionen
Här är ett exempel på hur du uppdaterar spelarens poäng.
Låt oss först se vad spelarens nuvarande poäng är.
SELECT * FROM udf_GetScore_ITVF('Homer');
Resultat:
+---------+ | Score | |---------| | 1 | +---------+
Så Homer har en poäng på 1.
Låt oss använda den tabellvärdade funktionen för att öka den.
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999; SELECT * FROM udf_GetScore_ITVF('Homer');
Resultat:
+---------+ | Score | |---------| | 99999 | +---------+
Så jag ökade framgångsrikt Homers poäng med den inline-tabellvärderade funktionen.
Exempel 3 – När det inte fungerar
Vilka kolumner du faktiskt kan uppdatera beror på vilka kolumner som väljs i frågan. Min fråga väljer bara Score
kolumnen, så jag kan bara uppdatera data i den kolumnen.
Det här är vad som händer om jag försöker uppdatera data i en annan kolumn.
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';
Resultat:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'Player'.
Vi vet att bordet har en Player
kolumnen (eftersom den finns i WHERE
klausul i funktionen). Det är dock inte markerat i frågan och därför är det inte en giltig kolumn att uppdatera.