I SQL Server er det muligt at opdatere data via en funktion med tabelværdi.
Hvad jeg mener er, at du kan opdatere data i de underliggende tabeller, som funktionen forespørger på.
For eksempel, hvis din funktion returnerer en persons fornavn fra en tabel, kan du opdatere deres fornavn ved at køre en UPDATE
sætning mod funktionen i stedet for tabellen.
Bemærk, at dette kun virker på inline table-valued functions (ITVF'er). Så vidt jeg ved, fungerer det ikke på multi-statement table-valued functions (MSTVF'er).
De kolonner, du opdaterer, skal også være gyldige kolonner i funktionens forespørgsel.
Eksempel 1 – Eksempelfunktion
Her er en hurtig funktion, der vælger grundlæggende data fra en tabel.
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255)) RETURNS TABLE AS RETURN ( SELECT Score FROM dbo.Scoreboard WHERE Player = @Player ); GO
Denne funktion vælger ganske enkelt scoren for en given spiller.
Jeg kunne bruge denne funktion til at opdatere en spillers score.
Jeg er klar over, at du typisk vil returnere mere end én kolonne, når du bruger en funktion med tabelværdi, men jeg vil gerne holde dette eksempel simpelt til demonstrationsformål.
Eksempel 2 – Opdater data via funktionen
Her er et eksempel på opdatering af spillerens score.
Lad os først se, hvad spillerens nuværende score er.
SELECT * FROM udf_GetScore_ITVF('Homer');
Resultat:
+---------+ | Score | |---------| | 1 | +---------+
Så Homer har en score på 1.
Lad os bruge den tabelværdisatte funktion til at øge den.
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999; SELECT * FROM udf_GetScore_ITVF('Homer');
Resultat:
+---------+ | Score | |---------| | 99999 | +---------+
Så det lykkedes mig at øge Homer's score ved at bruge den indbyggede tabelværdi-funktion.
Eksempel 3 – Når det ikke virker
De faktiske kolonner, du kan opdatere, afhænger af de kolonner, der er valgt i forespørgslen. Min forespørgsel vælger kun Score
kolonne, så jeg kan kun opdatere dataene i den kolonne.
Her er, hvad der sker, hvis jeg forsøger at opdatere data i en anden kolonne.
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';
Resultat:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'Player'.
Vi ved, at bordet har en Player
kolonne (fordi den er i WHERE
klausul af funktionen). Det er dog ikke valgt i forespørgslen, og derfor er det ikke en gyldig kolonne at opdatere.