Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aktualisieren Sie Daten über eine Tabellenwertfunktion in SQL Server

In SQL Server ist es möglich, Daten über eine Tabellenwertfunktion zu aktualisieren.

Was ich meine ist, dass Sie Daten in den zugrunde liegenden Tabellen aktualisieren können, die die Funktion abfragt.

Wenn Ihre Funktion beispielsweise den Vornamen einer Person aus einer Tabelle zurückgibt, können Sie deren Vornamen aktualisieren, indem Sie ein UPDATE ausführen Anweisung gegen die Funktion statt der Tabelle.

Beachten Sie, dass dies nur bei Inline-Tabellenwertfunktionen (ITVFs) funktioniert. Soweit mir bekannt ist, funktioniert es nicht mit Tabellenwertfunktionen mit mehreren Anweisungen (MSTVFs).

Außerdem müssen die Spalten, die Sie aktualisieren, gültige Spalten in der Abfrage der Funktion sein.

Beispiel 1 – Beispielfunktion

Hier ist eine schnelle Funktion, die grundlegende Daten aus einer Tabelle auswählt.

CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255))
    RETURNS TABLE
AS
RETURN (
    SELECT Score
    FROM dbo.Scoreboard
    WHERE Player = @Player
    );
GO

Diese Funktion wählt einfach die Punktzahl für einen bestimmten Spieler aus.

Ich könnte diese Funktion verwenden, um die Punktzahl eines Spielers zu aktualisieren.

Mir ist klar, dass Sie normalerweise mehr als eine Spalte zurückgeben würden, wenn Sie eine Tabellenwertfunktion verwenden, aber ich möchte dieses Beispiel zu Demonstrationszwecken einfach halten.

Beispiel 2 – Daten über die Funktion aktualisieren

Hier ist ein Beispiel für die Aktualisierung der Punktzahl des Spielers.

Sehen wir uns zuerst an, wie hoch der aktuelle Punktestand dieses Spielers ist.

SELECT * FROM udf_GetScore_ITVF('Homer');

Ergebnis:

+---------+
| Score   |
|---------|
| 1       |
+---------+

Also hat Homer eine Punktzahl von 1.

Verwenden wir die Tabellenwertfunktion, um sie zu erhöhen.

UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999;

SELECT * FROM udf_GetScore_ITVF('Homer');

Ergebnis:

+---------+
| Score   |
|---------|
| 99999   |
+---------+

Also habe ich Homers Punktzahl mit der Inline-Tabellenwertfunktion erfolgreich erhöht.

Beispiel 3 – Wenn es nicht funktioniert

Die tatsächlichen Spalten, die Sie aktualisieren können, hängen von den in der Abfrage ausgewählten Spalten ab. Meine Abfrage wählt nur den Score aus Spalte, also kann ich nur die Daten in dieser Spalte aktualisieren.

Folgendes passiert, wenn ich versuche, Daten in einer anderen Spalte zu aktualisieren.

UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';

Ergebnis:

Msg 207, Level 16, State 1, Line 1
Invalid column name 'Player'.

Wir wissen, dass der Tisch einen Player hat Spalte (weil es in der WHERE ist Klausel der Funktion). Es ist jedoch in der Abfrage nicht ausgewählt und daher keine gültige zu aktualisierende Spalte.