Технически ... да, вы могли бы, но это не значит, что вы должны. Вы должны быть осторожны, избегая операторов GO (просто используйте Exec для каждого пакета), но вы можете сделать что-то вроде:
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
Тем не менее, я настоятельно рекомендую против такого решения, особенно если функция, которую вы хотите, является чем-то полезным, как функция Split. Я бы порекомендовал просто создать UDF и использовать его и оставлять до тех пор, пока вы не сможете использовать его снова.