Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Mettre à jour des données via une fonction table dans SQL Server

Dans SQL Server, il est possible de mettre à jour les données via une fonction table.

Ce que je veux dire, c'est que vous pouvez mettre à jour les données dans les tables sous-jacentes que la fonction interroge.

Par exemple, si votre fonction renvoie le prénom d'une personne à partir d'une table, vous pouvez mettre à jour son prénom en exécutant un UPDATE déclaration contre la fonction au lieu de la table.

Notez que cela ne fonctionne que sur les fonctions table en ligne (ITVF). Autant que je sache, cela ne fonctionnera pas sur les fonctions table multi-instructions (MSTVF).

De plus, les colonnes que vous mettez à jour devront être des colonnes valides dans la requête de la fonction.

Exemple 1 - Exemple de fonction

Voici une fonction rapide qui sélectionne les données de base d'un tableau.

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

Cette fonction sélectionne simplement le score d'un joueur donné.

Je pourrais utiliser cette fonction pour mettre à jour le score d'un joueur.

Je me rends compte que vous retournez généralement plus d'une colonne lors de l'utilisation d'une fonction table, mais je veux garder cet exemple simple à des fins de démonstration.

Exemple 2 - Mettre à jour les données via la fonction

Voici un exemple de mise à jour du score du joueur.

Voyons d'abord quel est le score actuel de ce joueur.

SELECT * FROM udf_GetScore_ITVF('Homer');

Résultat :

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

Donc Homer a un score de 1.

Utilisons la fonction table pour l'augmenter.

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

SELECT * FROM udf_GetScore_ITVF('Homer');

Résultat :

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

J'ai donc réussi à augmenter le score d'Homère à l'aide de la fonction de table en ligne.

Exemple 3 - Quand ça ne marchera pas

Les colonnes réelles que vous pouvez mettre à jour dépendent des colonnes sélectionnées dans la requête. Ma requête ne sélectionne que le Score colonne, je ne peux donc mettre à jour que les données de cette colonne.

Voici ce qui se passe si j'essaie de mettre à jour des données dans une autre colonne.

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

Résultat :

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

Nous savons que la table a un Player colonne (parce que c'est dans la colonne WHERE clause de la fonction). Cependant, elle n'est pas sélectionnée dans la requête et, par conséquent, ce n'est pas une colonne valide à mettre à jour.