In SQL Server è possibile aggiornare i dati tramite una funzione con valori di tabella.
Quello che voglio dire è che puoi aggiornare i dati nelle tabelle sottostanti che la funzione interroga.
Ad esempio, se la tua funzione restituisce il nome di qualcuno da una tabella, puoi aggiornare il suo nome eseguendo un UPDATE
istruzione contro la funzione anziché la tabella.
Si noti che questo funziona solo su funzioni con valori di tabella in linea (ITVF). Per quanto ne so, non funzionerà su funzioni con valori di tabella multi-istruzione (MSTVF).
Inoltre, le colonne che aggiorni dovranno essere colonne valide nella query della funzione.
Esempio 1 – Funzione di esempio
Ecco una rapida funzione che seleziona i dati di base da una tabella.
CREATE FUNCTION udf_GetScore_ITVF( @Player varchar(255)) RETURNS TABLE AS RETURN ( SELECT Score FROM dbo.Scoreboard WHERE Player = @Player ); GO
Questa funzione seleziona semplicemente il punteggio per un determinato giocatore.
Potrei usare questa funzione per aggiornare il punteggio di un giocatore.
Mi rendo conto che in genere restituiresti più di una colonna quando usi una funzione con valori di tabella, ma voglio mantenere questo esempio semplice a scopo dimostrativo.
Esempio 2:aggiornamento dei dati tramite la funzione
Ecco un esempio di aggiornamento del punteggio del giocatore.
Per prima cosa, vediamo qual è il punteggio attuale di quel giocatore.
SELECT * FROM udf_GetScore_ITVF('Homer');
Risultato:
+---------+ | Score | |---------| | 1 | +---------+
Quindi Homer ha un punteggio di 1.
Usiamo la funzione con valori di tabella per aumentarlo.
UPDATE udf_GetScore_ITVF('Homer') SET Score = 99999; SELECT * FROM udf_GetScore_ITVF('Homer');
Risultato:
+---------+ | Score | |---------| | 99999 | +---------+
Quindi ho aumentato con successo il punteggio di Homer usando la funzione inline con valori di tabella.
Esempio 3 – Quando non funziona
Le colonne effettive che puoi aggiornare dipenderanno dalle colonne selezionate nella query. La mia query seleziona solo il Score
colonna, quindi posso aggiornare solo i dati in quella colonna.
Ecco cosa succede se provo ad aggiornare i dati in un'altra colonna.
UPDATE udf_GetScore_ITVF('Homer') SET Player = 'Apu';
Risultato:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'Player'.
Sappiamo che il tavolo ha un Player
colonna (perché si trova nella WHERE
clausola della funzione). Tuttavia, non è selezionato nella query e, pertanto, non è una colonna valida da aggiornare.