sql >> Databasteknik >  >> RDS >> Sqlserver

Uppdatera data via en tabellvärderad funktion i SQL Server

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.


  1. Hur man uppgraderar PostgreSQL 11 till PostgreSQL 12 med noll driftstopp

  2. PARSE() vs TRY_PARSE() i SQL Server:Vad är skillnaden?

  3. AOL/J Setup Test Suite

  4. Hur man bygger en Access-databas i molnet