Tekniskt sett...ja det kan du men det betyder inte att du borde. Du måste vara försiktig med att undvika GO-satser (använd bara Exec för varje batch) men du kan göra något som:
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
Som sagt, jag skulle starkt rekommendera denna typ av lösning, speciellt om funktionen du vill ha är något som skulle vara användbart som en Split-funktion. Jag skulle rekommendera att bara skapa UDF och använda den och lämna den tills du kanske använder den igen.