Secondo questo blog, i parametri di una funzione o di una procedura memorizzata sono essenzialmente pass-by-value se non sono OUTPUTparametri e essenzialmente trattati come una versione più sicura di pass-by-reference se sono OUTPUTparametri.
All'inizio ho pensato che l'obiettivo di forzare la dichiarazione di TVP READONLYfosse quello di segnalare chiaramente agli sviluppatori che il TVP non può essere usato come OUTPUTparametro, 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
OUTPUTparametro per qualche motivo?
TYPEvariabile 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 ilRETURNSvalore della mia funzione è una tabella con lo stesso DDL del tipo TVP?