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 OUTPUT
paramètres et essentiellement traités comme une version plus sûre de pass-by-reference s'ils sont des OUTPUT
paramè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 OUTPUT
paramè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
OUTPUT
paramètre pour une raison quelconque?
TYPE
variable 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 laRETURNS
valeur de ma fonction est une table avec le même DDL que le type TVP?