Selon ce blog, les paramètres d'une fonction ou d'une procédure stockée sont essentiellement pass-by-value s'ils ne sont pas des OUTPUTparamètres et essentiellement traités comme une version plus sûre de pass-by-reference s'ils sont des OUTPUTparamètres.
Au début, je pensais que le but de forcer la déclaration de TVP READONLYétait de signaler clairement aux développeurs que le TVP ne pouvait pas être utilisé comme OUTPUTparamètre, mais il devait y en avoir plus car nous ne pouvons pas déclarer non-TVP comme READONLY. Par exemple, ce qui suit échoue:
create procedure [dbo].[test]
@a int readonly
as
select @a
Msg 346, niveau 15, état 1, test de procédure
Le paramètre "@a" ne peut pas être déclaré LECTURE car il ne s'agit pas d'un paramètre table.
- Étant donné que les statistiques ne sont pas stockées sur TVP, quelle est la raison derrière la prévention des opérations DML?
- Est-ce lié à ne pas vouloir que le TVP soit un
OUTPUTparamètre pour une raison quelconque?
TYPEvariable TVP utilisateur ou aDECLARE x as TABLE (...)) avec une procédure stockée? Puis-je le faire, bien qu'avec une plus grande empreinte mémoire, avec une fonction à la place avecset @tvp = myfunction(@tvp)si laRETURNSvaleur de ma fonction est une table avec le même DDL que le type TVP?