- When multiple calls to the same UDF are in a single statement, how many times will it be called?
- SELECT
- column1,
- column2,
- dbo.FUNC(column3) AS column3
- FROM table1
- WHERE dbo.FUNC(column3) >= 5
- ORDER BY dbo.FUNC(column3) DESC
- CREATE FUNCTION dbo.FUNC1(@p1 int)
- RETURNS int
- AS
- BEGIN
- RETURN @p1 + 1
- END
- GO
- CREATE FUNCTION dbo.FUNC2(@p1 int)
- RETURNS int
- WITH SCHEMABINDING
- AS
- BEGIN
- RETURN @p1 + 1
- END
- GO
- SELECT
- OBJECTPROPERTYEX(OBJECT_ID('dbo.FUNC1'), 'IsDeterministic'),
- OBJECTPROPERTYEX(OBJECT_ID('dbo.FUNC2'), 'IsDeterministic')
- GO
- SELECT
- dbo.FUNC1(number) AS FUNC1,
- dbo.FUNC2(number) AS FUNC2
- FROM master..spt_values
- WHERE dbo.FUNC1(number) >= 5 AND dbo.FUNC2(number) >= 5
- ORDER BY dbo.FUNC1(number), dbo.FUNC2(number)
- |--Sort(ORDER BY:([Expr1003] ASC, [Expr1004] ASC))
- |--Compute Scalar(DEFINE:([Expr1003]=[test].[dbo].[FUNC1]([master].[dbo].[spt_values].[number])))
- |--Filter(WHERE:([test].[dbo].[FUNC1]([master].[dbo].[spt_values].[number])>=(5) AND [Expr1004]>=(5)))
- |--Compute Scalar(DEFINE:([Expr1004]=[test].[dbo].[FUNC2]([master].[dbo].[spt_values].[number])))
- |--Index Scan(OBJECT:([master].[dbo].[spt_values].[ix2_spt_values_nu_nc]))
- SELECT
- FUNC1,
- FUNC2
- FROM master..spt_values
- CROSS APPLY (SELECT dbo.FUNC1(number), dbo.FUNC2(number)) C(FUNC1, FUNC2)
- WHERE FUNC1 >= 5 AND FUNC2 >= 5
- ORDER BY FUNC1, FUNC2
- |--Sort(ORDER BY:([Expr1003] ASC, [Expr1004] ASC))
- |--Filter(WHERE:([Expr1003]>=(5)))
- |--Compute Scalar(DEFINE:([Expr1003]=[test].[dbo].[FUNC1]([master].[dbo].[spt_values].[number])))
- |--Filter(WHERE:([Expr1004]>=(5)))
- |--Compute Scalar(DEFINE:([Expr1004]=[test].[dbo].[FUNC2]([master].[dbo].[spt_values].[number])))
- |--Index Scan(OBJECT:([master].[dbo].[spt_values].[ix2_spt_values_nu_nc]))
- SELECT
- FUNC1 + 10,
- FUNC2 + 10
- FROM master..spt_values
- CROSS APPLY (SELECT dbo.FUNC1(number), dbo.FUNC2(number)) C(FUNC1, FUNC2)
- WHERE FUNC1 >= 5 AND FUNC2 >= 5
- ORDER BY FUNC1, FUNC2
- |--Compute Scalar(DEFINE:([Expr1005]=[Expr1003]+(10)))
- |--Sort(ORDER BY:([Expr1003] ASC, [Expr1004] ASC))
- |--Filter(WHERE:([Expr1003]>=(5)))
- |--Compute Scalar(DEFINE:([Expr1003]=[test].[dbo].[FUNC1]([master].[dbo].[spt_values].[number])))
- |--Filter(WHERE:([Expr1004]>=(5)))
- |--Compute Scalar(DEFINE:([Expr1004]=[test].[dbo].[FUNC2]([master].[dbo].[spt_values].[number]), [Expr1006]=[test].[dbo].[FUNC2]([master].[dbo].[spt_values].[number])+(10)))
- |--Index Scan(OBJECT:([master].[dbo].[spt_values].[ix2_spt_values_nu_nc]))