sql >> Database teknologi >  >> RDS >> Sqlserver

Opdater data via en funktion med tabelværdi i SQL Server

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.


  1. MariaDB LOCALTIME() Forklaret

  2. Trævisningskontrol Afkrydsningsmærke Tilføj Slet noder

  3. Svarende til LIMIT og OFFSET for SQL Server?

  4. TSQL-e-mail-validering (uden regex)