Technicznie... tak, możesz, ale to nie znaczy, że powinieneś. Musisz uważać na unikanie instrukcji GO (wystarczy użyć Exec dla każdej partii), ale możesz zrobić coś takiego:
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
To powiedziawszy, zdecydowanie odradzałbym tego rodzaju rozwiązanie, zwłaszcza jeśli żądana funkcja jest czymś, co byłoby przydatne, jak funkcja Split. Sugerowałbym po prostu utworzenie UDF i używanie go i pozostawienie go do czasu, gdy będziesz mógł go ponownie użyć.