Tecnicamente... sì, potresti, ma ciò non significa che dovresti. Dovresti stare attento a evitare le istruzioni GO (usa semplicemente Exec per ogni batch) ma potresti fare qualcosa del tipo:
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
Detto questo, sconsiglio vivamente questo tipo di soluzione, soprattutto se la funzione che si desidera è qualcosa che sarebbe utile come una funzione Dividi. Consiglierei semplicemente di creare l'UDF e di usarlo e di lasciarlo fino a quando non potresti usarlo di nuovo.