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.