Técnicamente... sí, podrías, pero eso no significa que debas hacerlo. Tendría que tener cuidado de evitar declaraciones GO (simplemente use Exec para cada lote), pero podría hacer algo como:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE dbo.Test
AS
Declare @Sql nvarchar(max)
Set @Sql = 'CREATE FUNCTION dbo.Foo
(
)
RETURNS TABLE
AS
RETURN
(
SELECT 0 As Bar
)'
Exec(@Sql)
Select *
From dbo.Foo()
Set @Sql = 'Drop Function dbo.Foo'
Exec(@Sql)
Return
GO
Exec dbo.Test
Dicho esto, recomendaría enfáticamente este tipo de solución, especialmente si la función que desea es algo que sería útil como una función de división. Recomendaría simplemente crear el UDF y usarlo y dejarlo hasta que pueda usarlo nuevamente.