Non consiglio di farlo in quanto ogni volta che viene creato deve essere calcolato un nuovo piano di esecuzione, ma SÌ, sicuramente si può fare (tutto è possibile, ma non sempre consigliato).
Ecco un esempio:
CREATE PROC [dbo].[sp_helloworld]
AS
BEGIN
SELECT 'Hello World'
DECLARE @sSQL VARCHAR(1000)
SET @sSQL = 'CREATE PROC [dbo].[sp_helloworld2]
AS
BEGIN
SELECT ''Hello World 2''
END'
EXEC (@sSQL)
EXEC [sp_helloworld2];
DROP PROC [sp_helloworld2];
END
Riceverai l'avviso
The module 'sp_helloworld' depends on the missing object 'sp_helloworld2'.
The module will still be created; however, it cannot run successfully until
the object exists.
Puoi ignorare questo avviso utilizzando EXEC('sp_helloworld2') sopra.
Ma se chiami EXEC [sp_helloworld] otterrai i risultati
Hello World
Hello World 2