Secondo questo blog, i parametri di una funzione o di una procedura memorizzata sono essenzialmente pass-by-value se non sono OUTPUT
parametri e essenzialmente trattati come una versione più sicura di pass-by-reference se sono OUTPUT
parametri.
All'inizio ho pensato che l'obiettivo di forzare la dichiarazione di TVP READONLY
fosse quello di segnalare chiaramente agli sviluppatori che il TVP non può essere usato come OUTPUT
parametro, ma ci devono essere molti altri perché non possiamo dichiarare non-TVP come READONLY
. Ad esempio, quanto segue non riesce:
create procedure [dbo].[test]
@a int readonly
as
select @a
Messaggio 346, livello 15, stato 1, test di procedura
Il parametro "@a" non può essere dichiarato READONLY poiché non è un parametro con valori di tabella.
- Poiché le statistiche non sono archiviate su TVP, qual è la logica alla base della prevenzione delle operazioni DML?
- È collegato al fatto che non si desidera che TVP sia un
OUTPUT
parametro per qualche motivo?
TYPE
variabile TVP utente o aDECLARE x as TABLE (...)
) con una procedura memorizzata? Posso farlo, anche se con un footprint di memoria maggiore, con una funzione anzichéset @tvp = myfunction(@tvp)
se ilRETURNS
valore della mia funzione è una tabella con lo stesso DDL del tipo TVP?