sql >> Database >  >> RDS >> Sqlserver

Gegevens bijwerken via een functie met tabelwaarde in SQL Server

In SQL Server is het mogelijk om gegevens bij te werken via een functie met tabelwaarde.

Wat ik bedoel is dat je gegevens kunt bijwerken in de onderliggende tabellen die door de functie worden opgevraagd.

Als uw functie bijvoorbeeld de voornaam van iemand uit een tabel retourneert, kunt u hun voornaam bijwerken door een UPDATE uit te voeren. statement tegen de functie in plaats van de tabel.

Merk op dat dit alleen werkt op inline table-valued functions (ITVF's). Voor zover ik weet, werkt het niet op multi-statement table-valued functions (MSTVF's).

De kolommen die u bijwerkt, moeten ook geldige kolommen zijn in de query van de functie.

Voorbeeld 1 – Voorbeeldfunctie

Hier is een snelle functie die basisgegevens uit een tabel selecteert.

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

Deze functie selecteert eenvoudig de score voor een bepaalde speler.

Ik zou deze functie kunnen gebruiken om de score van een speler bij te werken.

Ik realiseer me dat u doorgaans meer dan één kolom retourneert wanneer u een functie met tabelwaarde gebruikt, maar ik wil dit voorbeeld eenvoudig houden voor demonstratiedoeleinden.

Voorbeeld 2 – Gegevens bijwerken via de functie

Hier is een voorbeeld van het bijwerken van de score van de speler.

Laten we eerst eens kijken wat de huidige score van die speler is.

SELECT * FROM udf_GetScore_ITVF('Homer');

Resultaat:

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

Dus Homer heeft een score van 1.

Laten we de functie tabelwaarde gebruiken om deze te vergroten.

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

SELECT * FROM udf_GetScore_ITVF('Homer');

Resultaat:

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

Dus ik heb Homer's score met succes verhoogd met behulp van de inline-tabelwaardefunctie.

Voorbeeld 3 – Wanneer het niet werkt

De daadwerkelijke kolommen die u kunt bijwerken, zijn afhankelijk van de kolommen die in de query zijn geselecteerd. Mijn zoekopdracht selecteert alleen de Score kolom, dus ik kan alleen de gegevens in die kolom bijwerken.

Dit gebeurt er als ik gegevens in een andere kolom probeer bij te werken.

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

Resultaat:

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

We weten dat de tafel een Player . heeft kolom (omdat het in de WHERE staat) clausule van de functie). Het is echter niet geselecteerd in de zoekopdracht en daarom is het geen geldige kolom om bij te werken.


  1. De provider is niet compatibel met de versie van de Oracle-client

  2. Onderhouden van een gegroepeerde lopende MAX (of MIN)

  3. Hoe kan ik nieuwe kolommen toevoegen aan een SQLite-database nadat de Android-app is uitgebracht?

  4. selecteer count(*) uit de tabel van mysql in php